DataFrame是一个2维的带标签的数据结构。可以把它看做是一个SQL表,或时一个Series对象的字典。是最常使用的pandas对象。
DataFrame的构建
和Series一样,DataFrame接受多种不同的输入,如1维ndarray、list、字典、Series构成的字典、numpy结构化数组,或是另一个DataFrame。
除了数据输入之外,还可以随意的输入索引(行标签)和列(列标签)参数。如果输入一个索引或列,
下面介绍一些常用的用于构建DataFrame的输入
1、 Series或字典构成的字典
所构成的DataFrame的索引,是输入的各Series的索引的并集。如果输入是一个嵌套的字典,会先将其转换为Series。如果没有传入columns参数,那么列按字典key进行排序。
d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
In: df = pd.DataFrame(d, index=['d', 'b', 'a'])
Out:
one two
d NaN 4.0
b 2.0 2.0
a 1.0 1.0
DataFrame对象的行和列标签可分别通过 index 和 columns 属性获取:df.index
,df.columns
2、ndarray/list/tuple构成的字典
组成字典的ndarray必须具有相同的长度。如果传入了 index 参数,长度也必须与ndarray的长度相等。如果没有传入 index 参数,则索引为range(n),n为ndarray长度。
d = {'one': [1., 2., 3., 4.],
'two': [4., 3., 2., 1.]}
In: pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
Out:
one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0
3、字典的list
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
In: pd.DataFrame(data)
Out:
a b c
0 1 2 NaN
1 5 10 20.0
4、numpy结构化数组
这种情况和处理 数组的字典类似。
data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])
data[:] = [(1, 2., 'Hello'), (2, 3., "World")]
In: pd.DataFrame(data)
Out:
A B C
0 1 2.0 b'Hello'
1 2 3.0 b'World'
此外,对字典数据,还可使用DataFrame.from_dict构造器创建DataFrame。结构化数据则可使用DataFrame.from_records进行构造。
列的选择、添加、删除
可以把DataFrame看做一个关于Series对象的字典,操作其列的语法类似于字典。
通过给出列索引df['one']
来获取列。
队列的运算也以类似的方式直接进行df['three'] = df['one'] * df['two']
、df['flag'] = df['one'] > 2
。
删除列则通过和字典类似的pop函数three = df.pop('three')
,并将删除的列对象返回。
使用标量给列赋值时,df['foo'] = 'bar'
, 整列均为给定标量值。
当插入一个与DataFrame行索引不完全相同的Series时,会根据DataFrame行索引匹配Series中的值,再进行插入。
当使用原始的ndarray给DataFrame的列赋值或创建新的列时,ndarray的长度必须与DataFrame行索引长度相同。
默认情况下,新插入的列会排在列索引的最后。可以使用 insert 函数执行插入操作,此时可以指定新列在列索引中的位置,如df.insert(1, 'bar', df['one'])
表示插入到列索引 1 位置。
使用pandas函数得到新列
DataFrame有一个assign()方法,可以通过调用函数,利用现有列创建新的列。如df.assign(new_col=df['a'] / df['b'])
,通过原列 a 和 b 相除创建 new_col 列。
或者采用lambda函数而不直接引入DataFrame的方式:df.assign(new_col =lambda x: (x['a'] / x['b']))
此时x表示调用assign函数的DataFrame。如需事先对DataFrame执行一些类似筛选的操作,这种调用方式更方面:
df.query('a> 5').assign(new_col1=lambda x: x.a/ x.b, new_col2=lambda x: x.c / x.d)
使用assign函数返回的都是数据副本,原数据不变。
0.23.0版本后,基于python3.6保存**kwargs顺序的特征,在同一个assign函数中可以引用先创造列:
df.assign(new_col1=lambda x: x.a/ x.b, new_col2=lambda x: x.c / x.new_col1)
根据索引选择行列
索引的基础用法如下
操作 | 句法 | 结果 |
---|---|---|
选择列 | df[col] | Series |
用标签选择行 | df.loc[label] | Series |
用整数位置选择行 | df.iloc[loc] | Series |
行切片 | df[5:10] | DataFrame |
用布尔向量选择行 | df[bool_vec] | DataFrame |
数据对齐和运算
DataFrame对象可以自动根据索引对齐行和列的数据。生成的结果DataFrame是原数据行和列索引的并集。
DataFrame和Series之间执行操作,默认在DataFrame的列上对齐Sereis的索引。并按行进行广播。
如果DataFrame的行索引中包含日期,则按列广播。
支持元素级别的布尔运算,对布尔型DataFramedf1
和df2
,可直接运算df1 & df2
,df1 | df2
,df1 ^ df2
,-df1
。
转置
类似多维数组,T属性可以转置DataFrame,df.T
。
DataFrame应用Numpy函数
Series和DataFrame可使用log、exp、sqrt等多种元素级ufunc。函数作用在对象的底层数组上。