DataFrame入门
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
下面记录DataFrame的常见使用,引入pandas约定:
from pandas import Series,DataFrameimport pandas as pd
DataFrame基本操作
1. 创建一个DataFrame数据框
创建一个DataFrame最常见的方法是传入一个等长的列表或者Numpy数组组成的字典。
In [16]: d = { ...: "name":["cat","dog","lion"], ...: "age":[3,5,6], ...: "sex":["male","female","male"] ...: }In [17]: dOut[17]:{'name': ['cat', 'dog', 'lion'], 'age': [3, 5, 6], 'sex': ['male', 'female', 'male']}In [18]: df = pd.DataFrame(d)In [19]: dfOut[19]: name age sex0 cat 3 male1 dog 5 female2 lion 6 male
2. 查看数据框的概述
In [20]: df.info()<class 'pandas.core.frame.DataFrame'>RangeIndex: 3 entries, 0 to 2 # 三个索引,从0到2Data columns (total 3 columns): # 字段信息name 3 non-null object # 字符串类型age 3 non-null int64 # 整型sex 3 non-null object # 字符串类型dtypes: int64(1), object(2) # 统计数据类型信息memory usage: 152.0+ bytes # 占用内存大小
3. 切片和索引
3.1 基于列索引进行切片
In [24]: df.ageOut[24]:0 31 52 6Name: age, dtype: int64In [25]: df['age']Out[25]:0 31 52 6Name: age, dtype: int64In [26]: df[['age','name']]Out[26]: age name0 3 cat1 5 dog2 6 lion
3.2 基于行索引进行切片
基于行索引进行切片有多种方法,比如DataFrame里的ix
函数,loc
函数和iloc
函数等。
In [27]: df.ix[0]D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning:.ix is deprecated. Please use.loc for label based indexing or.iloc for positional indexingSee the documentation here:http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecatedOut[27]:name catage 3sex maleName: 0, dtype: object
使用ix函数
可以进行行索引的切片,但是pandas建议使用loc或者iloc。
In [28]: df.ix[0:1]D:\work-enviorament\anaconda\Scripts\ipython:1: DeprecationWarning:.ix is deprecated. Please use.loc for label based indexing or.iloc for positional indexingSee the documentation here:http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecatedOut[28]: name age sex0 cat 3 male1 dog 5 femaleIn [29]: df[0:1] # 类似列表的切片操作Out[29]: name age sex0 cat 3 maleIn [30]: df[0:2]Out[30]: name age sex0 cat 3 male1 dog 5 female
同样,也可以使用类似列表切片的操作进行行索引切片,不过ix函数的这种操作会包括右边的索引,切的范围不同。
对于切出来的数据,数据类型还是数据框的,可以继续切片(多重切片)。
In [36]: df[0:2]['name']Out[36]:0 cat1 dogName: name, dtype: object
4. 选取和修改值
In [37]: dfOut[37]: name age sex0 cat 3 male1 dog 5 female2 lion 6 maleIn [38]: df['age']Out[38]:0 31 52 6Name: age, dtype: int64In [39]: df['age'] = 10 # 基于整列的值都修改为10In [40]: dfOut[40]: name age sex0 cat 10 male1 dog 10 female2 lion 10 maleIn [41]: df['age'][0] = 20 # 修改age列的第一行的值为20In [42]: dfOut[42]: name age sex0 cat 20 male1 dog 10 female2 lion 10 maleIn [43]: df.age = [3,4,5] # 为多个字段赋值可以传入一个列表In [44]: dfOut[44]: name age sex0 cat 3 male1 dog 4 female2 lion 5 male
5. 数据的筛选
某些情况下,需要根据一些数据进行筛选,比如筛选出年龄大于5岁的人或者居住地区为广州的人等等。
In [44]: dfOut[44]: name age sex0 cat 3 male1 dog 4 female2 lion 5 maleIn [46]: df.age == 4 # 逻辑判断,年龄等于4的,返回一个Series的布尔型数组Out[46]:0 False1 True2 FalseName: age, dtype: boolIn [47]: df[df.age == 4] # 根据这个布尔型数组进行索引,返回为True的Out[47]: name age sex1 dog 4 femaleIn [48]: df[[False,True,False]] # 这种与上面方法是等价的Out[48]: name age sex1 dog 4 femaleIn [51]: df.age > 3 # 大于小于也是可以的Out[51]:0 False1 True2 TrueName: age, dtype: bool
这里也有个小技巧就是,在这些逻辑判断操作的前面加上~号,就可以反转结果,如下:
In [54]: df.age == 3Out[54]:0 True1 False2 FalseName: age, dtype: boolIn [55]: ~(df.age == 3)Out[55]:0 False1 True2 TrueName: age, dtype: bool
同时也支持多重筛选
In [57]: dfOut[57]: name age sex0 cat 3 male1 dog 4 female2 lion 5 maleIn [58]: (df.age == 3) & (df.name == 'cat')Out[58]:0 True1 False2 Falsedtype: boolIn [59]: df[(df.age == 3) & (df.name == 'cat')]Out[59]: name age sex0 cat 3 male
pandas的query函数也可以达到筛选功能
In [66]: df.query("age == 3")Out[66]: name age sex0 cat 3 maleIn [67]: df.query("(age == 3)&(sex=='male')")Out[67]: name age sex0 cat 3 male
6. 使用loc与iloc
对于DataFrame的行的标签索引,引入了特殊的标签运算符loc和iloc。它们可以让你用类似NumPy的标记,使用轴标签(loc)或整数索引(iloc),从DataFrame选择行和列的子集。
In [73]: dfOut[73]: name age sex0 cat 3 male1 dog 4 female2 lion 5 maleIn [74]: df.iloc[1] # 根据行标签进行索引,选取行索引为1的行Out[74]:name dogage 4sex femaleName: 1, dtype: objectIn [75]: df.iloc[0:2] Out[75]: name age sex0 cat 3 male1 dog 4 female
如果行标签不是整数,而是字符串,那么就可以使用loc了。
In [76]: df.index = list('abc') # 将行索引改为abcIn [77]: dfOut[77]: name age sexa cat 3 maleb dog 4 femalec lion 5 maleIn [78]: df.loc['a'] # 选取行索引为a的行Out[78]:name catage 3sex maleName: a, dtype: objectIn [79]: df.loc[['a','b']]Out[79]: name age sexa cat 3 maleb dog 4 femaleIn [80]: df.iloc[0] # 同样也可以使用ilocOut[80]:name catage 3sex maleName: a, dtype: object
iloc是根据具体的行的位置进行索引的,也就不管行标签是整数还是字符串类型,而loc是根据行标签进行索引的。
loc和iloc还有支持多个参数进行索引
In [83]: dfOut[83]: name age sexa cat 3 maleb dog 4 femalec lion 5 maleIn [84]: df.iloc[0:2] # 选取第一行和第二行Out[84]: name age sexa cat 3 maleb dog 4 femaleIn [85]: df.iloc[0:2,1] # 选取列,列索引从0开始,所以选取第二列的数据Out[85]:a 3b 4Name: age, dtype: int64In [86]: df.iloc[0:2,[0,1]] # 选取多列Out[86]: name agea cat 3b dog 4