DataFrame

DataFrame 表示矩阵数据表,有行索引和列索引。

构建方式


In [43]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
    ...:         'year' : [2000, 2001, 2002, 2001, 2001, 2003],
    ...:         'pop'  : [1.5, 1.7,  3.6, 2.4, 2.9, 3.2]}

In [44]: frame = pd.DataFrame(data)

In [45]: frame
Out[45]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2001  2.9
5  Nevada  2003  3.2

对于大型 DataFrame,head 方法只选出前5行

In [46]: frame.head()
Out[46]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2001  2.9

指定顺序

In [47]: pd.DataFrame(data, columns=['year', 'state', 'pop'])
Out[47]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2001  Nevada  2.9
5  2003  Nevada  3.2

传的列不在字典中

In [49]: frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
    ...:                                  index=['one', 'two', 'three', 'four', 'five', 'six'])

In [50]: frame2
Out[50]:
       year   state  pop debt
one    2000    Ohio  1.5  NaN
two    2001    Ohio  1.7  NaN
three  2002    Ohio  3.6  NaN
four   2001  Nevada  2.4  NaN
five   2001  Nevada  2.9  NaN
six    2003  Nevada  3.2  NaN

某一列可以按字典型标记或属性检索为 Series

In [51]: frame2['state']
Out[51]:
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
six      Nevada
Name: state, dtype: object

In [52]: frame2.year
Out[52]:
one      2000
two      2001
three    2002
four     2001
five     2001
six      2003
Name: year, dtype: int64

行也可以通过位置或特殊属性 loc 进行选取

In [53]: frame2.loc['three']
Out[53]:
year     2002
state    Ohio
pop       3.6
debt      NaN
Name: three, dtype: object

列的引用是可以修改的

In [54]: frame2['debt'] = 16.5

In [55]: frame2
Out[55]:
       year   state  pop  debt
one    2000    Ohio  1.5  16.5
two    2001    Ohio  1.7  16.5
three  2002    Ohio  3.6  16.5
four   2001  Nevada  2.4  16.5
five   2001  Nevada  2.9  16.5
six    2003  Nevada  3.2  16.5
In [56]: frame2['debt'] = np.arange(6.)

In [57]: frame2
Out[57]:
       year   state  pop  debt
one    2000    Ohio  1.5   0.0
two    2001    Ohio  1.7   1.0
three  2002    Ohio  3.6   2.0
four   2001  Nevada  2.4   3.0
five   2001  Nevada  2.9   4.0
six    2003  Nevada  3.2   5.0

将Series赋值给一列

In [58]: val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])

In [59]: frame2['debt'] = val

In [60]: frame2
Out[60]:
       year   state  pop  debt
one    2000    Ohio  1.5   NaN
two    2001    Ohio  1.7  -1.2
three  2002    Ohio  3.6   NaN
four   2001  Nevada  2.4  -1.5
five   2001  Nevada  2.9  -1.7
six    2003  Nevada  3.2   NaN

del 删除某一列

In [61]: frame2['eastern'] = frame2.state == 'Ohio'

In [62]: frame2
Out[62]:
       year   state  pop  debt  eastern
one    2000    Ohio  1.5   NaN     True
two    2001    Ohio  1.7  -1.2     True
three  2002    Ohio  3.6   NaN     True
four   2001  Nevada  2.4  -1.5    False
five   2001  Nevada  2.9  -1.7    False
six    2003  Nevada  3.2   NaN    False

In [63]: del frame2['eastern']

In [64]: frame2.columns
Out[64]: Index(['year', 'state', 'pop', 'debt'], dtype='object')

对Series的修改会映射到DaraFrame中,如果要复制,应显示使用Series的copy方法

另一种数据形式

In [65]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},
    ...:        'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}

In [66]: frame3 = pd.DataFrame(pop)

In [67]: frame3
Out[67]:
      Nevada  Ohio
2000     NaN   1.5
2001     2.4   1.7
2002     2.9   3.6

调换行和列

In [68]: frame3.T
Out[68]:
        2000  2001  2002
Nevada   NaN   2.4   2.9
Ohio     1.5   1.7   3.6

如果显示指明索引,则内部的字典的键不会被排序

In [69]: pd.DataFrame(pop, index=[2001, 2002, 2003])
Out[69]:
      Nevada  Ohio
2001     2.4   1.7
2002     2.9   3.6
2003     NaN   NaN

包含Series的字典也可以用于构造DataFrame

In [70]: pdata = {'Ohio': frame3['Ohio'][: -1],
    ...:          'Nevada': frame3['Nevada'][: 2]}

In [71]: pd.DataFrame(pdata)
Out[71]:
      Ohio  Nevada
2000   1.5     NaN
2001   1.7     2.4

索引和列拥有name属性

In [72]: frame3.index.name = 'year'

In [73]: frame3.columns.name = 'state'

In [74]: frame3
Out[74]:
state  Nevada  Ohio
year
2000      NaN   1.5
2001      2.4   1.7
2002      2.9   3.6
In [75]: frame3.values
Out[75]:
array([[nan, 1.5],
       [2.4, 1.7],
       [2.9, 3.6]])

自动选择适合所有列的类型

In [77]: frame2.values
Out[77]:
array([[2000, 'Ohio', 1.5, nan],
       [2001, 'Ohio', 1.7, -1.2],
       [2002, 'Ohio', 3.6, nan],
       [2001, 'Nevada', 2.4, -1.5],
       [2001, 'Nevada', 2.9, -1.7],
       [2003, 'Nevada', 3.2, nan]], dtype=object)

索引对象

在构造Series或DataFrame时,使用的任意数组或标签序列都可以在内部转换为索引对象

In [78]: obj = pd.Series(range(3), index=['a', 'b', 'c'])

In [79]: index = obj.index

In [80]: index
Out[80]: Index(['a', 'b', 'c'], dtype='object')

In [81]: index[1:]
Out[81]: Index(['b', 'c'], dtype='object')

In [82]: index[1] = 'd'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-82-a452e55ce13b> in <module>
----> 1 index[1] = 'd'

c:\users\a\appdata\local\programs\python\python36\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
   3881
   3882     def __setitem__(self, key, value):
-> 3883         raise TypeError("Index does not support mutable operations")
   3884
   3885     def __getitem__(self, key):

TypeError: Index does not support mutable operations

In [83]:

In [83]: labels = pd.Index(np.arange(3))

In [84]: labels
Out[84]: Int64Index([0, 1, 2], dtype='int64')

In [85]: obj2 = pd.Series([1.5, -2.5, 0], index=labels)

In [86]: obj2
Out[86]:
0    1.5
1   -2.5
2    0.0
dtype: float64

In [87]: obj2.index is labels
Out[87]: True

索引对象是不可变的

In [89]: frame3.columns
Out[89]: Index(['Nevada', 'Ohio'], dtype='object', name='state')

In [90]: 'Ohio' in frame3.columns
Out[90]: True

In [91]: 2003 in frame3.columns
Out[91]: False

In [88]: frame3
Out[88]:
state  Nevada  Ohio
year
2000      NaN   1.5
2001      2.4   1.7
2002      2.9   3.6

In [89]: frame3.columns
Out[89]: Index(['Nevada', 'Ohio'], dtype='object', name='state')

In [90]: 'Ohio' in frame3.columns
Out[90]: True

In [91]: 2003 in frame3.columns
Out[91]: False

In [92]: dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])

In [93]: dup_labels
Out[93]: Index(['foo', 'foo', 'bar', 'bar'], dtype='object')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 在python中,众所周知,数据预处理最好用的包就是pandas了,以下是pandas里的dataframe数据结...
    天涯海角醉云游阅读 31,264评论 1 12
  • DataFrame是一个2维标签的数据结构,可以把它简单的想成Excel表格或SQL Table,它的每一行或者每...
    躺在稻田里的小白菜阅读 2,723评论 0 3
  • DataFrame这种列表式数据结构跟我们常见的Excel极为相似。其设计初衷就是将Series的使用场景由一维扩...
    安东尼卡阅读 793评论 0 1
  • 置于时间之前的人,有种无畏,必是勇敢 滞于时间之后的人,有种无谓,亦是勇敢 勇敢……是必然吧……
    一个文字狗阅读 296评论 0 0
  • 在家 最近几天在家没事看了一些高中初中时同学写的的同学录,看到好些高中初中好些同学对我的一些印象,再看看现在的我,...
    xiaotian666阅读 235评论 0 1