pandas数据结构基础-DataFrame

2019-11-21  本文已影响0人  有机会一起种地OT

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.indexdf.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的行索引中包含日期,则按列广播。

支持元素级别的布尔运算,对布尔型DataFramedf1df2,可直接运算df1 & df2df1 | df2df1 ^ df2-df1

转置

类似多维数组,T属性可以转置DataFrame,df.T

DataFrame应用Numpy函数

Series和DataFrame可使用log、exp、sqrt等多种元素级ufunc。函数作用在对象的底层数组上。

上一篇下一篇

猜你喜欢

热点阅读