Pandas数据结构之DataFrame常见操作.docx
- 文档编号:25869978
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:17
- 大小:23.04KB
Pandas数据结构之DataFrame常见操作.docx
《Pandas数据结构之DataFrame常见操作.docx》由会员分享,可在线阅读,更多相关《Pandas数据结构之DataFrame常见操作.docx(17页珍藏版)》请在冰豆网上搜索。
Pandas数据结构之DataFrame常见操作
∙提取、添加、删除列
∙用方法链分配新列
∙索引/选择
∙数据对齐和运算
∙转置
∙DataFrame应用NumPy函数
∙控制台显示
∙DataFrame列属性访问和IPython代码补全
提取、添加、删除
DataFrame就像带索引的Series字典,提取、设置、删除列的操作与字典类似:
In [61]:
df['one']
Out[61]:
a 1.0
b 2.0
c 3.0
d NaN
Name:
one, dtype:
float64
In [62]:
df['three'] = df['one'] * df['two']
In [63]:
df['flag'] = df['one'] > 2
In [64]:
df
Out[64]:
one two three flag
a 1.0 1.0 1.0 False
b 2.0 2.0 4.0 False
c 3.0 3.0 9.0 True
d NaN 4.0 NaN False
删除(del、pop)列的方式也与字典类似:
In [65]:
del df['two']
In [66]:
three = df.pop('three')
In [67]:
df
Out[67]:
one flag
a 1.0 False
b 2.0 False
c 3.0 True
d NaN False
标量值以广播的方式填充列:
In [68]:
df['foo'] = 'bar'
In [69]:
df
Out[69]:
one flag foo
a 1.0 False bar
b 2.0 False bar
c 3.0 True bar
d NaN False bar
插入与DataFrame索引不同的Series时,以DataFrame的索引为准:
In [70]:
df['one_trunc'] = df['one'][:
2]
In [71]:
df
Out[71]:
one flag foo one_trunc
a 1.0 False bar 1.0
b 2.0 False bar 2.0
c 3.0 True bar NaN
d NaN False bar NaN
可以插入原生多维数组,但长度必须与DataFrame索引长度一致。
默认在DataFrame尾部插入列。
insert 函数可以指定插入列的位置:
In [72]:
df.insert(1, 'bar', df['one'])
In [73]:
df
Out[73]:
one bar flag foo one_trunc
a 1.0 1.0 False bar 1.0
b 2.0 2.0 False bar 2.0
c 3.0 3.0 True bar NaN
d NaN NaN False bar NaN
用方法链分配新列
受dplyr的 mutate 启发,DataFrame提供了 assign() 方法,可以利用现有的列创建新列。
In [74]:
iris = pd.read_csv('data/iris.data')
In [75]:
iris.head()
Out[75]:
SepalLength SepalWidth PetalLength PetalWidth Name
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
In [76]:
(iris.assign(sepal_ratio=iris['SepalWidth'] / iris['SepalLength'])
....:
.head())
....:
Out[76]:
SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio
0 5.1 3.5 1.4 0.2 Iris-setosa 0.686275
1 4.9 3.0 1.4 0.2 Iris-setosa 0.612245
2 4.7 3.2 1.3 0.2 Iris-setosa 0.680851
3 4.6 3.1 1.5 0.2 Iris-setosa 0.673913
4 5.0 3.6 1.4 0.2 Iris-setosa 0.720000
上例中,插入了一个预计算的值。
还可以传递带参数的函数,在 assign 的DataFrame上求值。
In [77]:
iris.assign(sepal_ratio=lambda x:
(x['SepalWidth'] / x['SepalLength'])).head()
Out[77]:
SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio
0 5.1 3.5 1.4 0.2 Iris-setosa 0.686275
1 4.9 3.0 1.4 0.2 Iris-setosa 0.612245
2 4.7 3.2 1.3 0.2 Iris-setosa 0.680851
3 4.6 3.1 1.5 0.2 Iris-setosa 0.673913
4 5.0 3.6 1.4 0.2 Iris-setosa 0.720000
assign 返回的都是数据副本,原DataFrame不变。
未引用DataFrame时,传递可调用的,不是实际要插入的值。
这种方式常见于在操作链中调用assign 的操作。
例如,将DataFrame限制为花萼长度大于5的观察值,计算比例,再制图:
In [78]:
(iris.query('SepalLength > 5')
....:
.assign(SepalRatio=lambda x:
x.SepalWidth / x.SepalLength,
....:
PetalRatio=lambda x:
x.PetalWidth / x.PetalLength)
....:
.plot(kind='scatter', x='SepalRatio', y='PetalRatio'))
....:
Out[78]:
上例用 assign 把函数传递给DataFrame,并执行函数运算。
这是要注意的是,该DataFrame是筛选了花萼长度大于5以后的数据。
首先执行的是筛选操作,再计算比例。
这个例子就是对没有事先筛选 DataFrame进行的引用。
assign 函数签名就是 **kwargs。
键是新字段的列名,值为是插入值(例如,Series 或NumPy数组),或把 DataFrame 当做调用参数的函数。
返回结果是插入新值的DataFrame副本。
从3.6版开始,Python可以保存 **kwargs 顺序。
这种操作允许依赖赋值,**kwargs 后的表达式,可以引用同一个 assign() 函数里之前创建的列。
In [79]:
dfa = pd.DataFrame({"A":
[1, 2, 3],
....:
"B":
[4, 5, 6]})
....:
In [80]:
dfa.assign(C=lambda x:
x['A'] + x['B'],
....:
D=lambda x:
x['A'] + x['C'])
....:
Out[80]:
A B C D
0 1 4 5 6
1 2 5 7 9
2 3 6 9 12
第二个表达式里,x['C'] 引用刚创建的列,与 dfa['A']+dfa['B'] 等效。
要兼容所有Python版本,可以把 assign 操作分为两部分。
In [81]:
dependent = pd.DataFrame({"A":
[1, 1, 1]})
In [82]:
(dependent.assign(A=lambda x:
x['A'] + 1)
....:
.assign(B=lambda x:
x['A'] + 2))
....:
Out[82]:
A B
0 2 4
1 2 4
2 2 4
依赖赋值改变了Python3.6及之后版本与Python3.6之前版本的代码操作方式。
要想编写支持3.6之前或之后版本的Python代码,传递 assign 表达式时,要注意以下两点:
∙更新现有的列
∙在同一个 assign 引用刚建立的更新列
示例如下,更新列“A”,然后,在创建“B”列时引用该列。
>>> dependent = pd.DataFrame({"A":
[1, 1, 1]})
>>> dependent.assign(A=lambda x:
x["A"] + 1, B=lambda x:
x["A"] + 2)
Python3.5或更早版本的表达式在创建 B 列时引用的是 A 列的“旧”值 [1,1,1]。
输出是:
AB023123223¨G30GAB024124224
索引基础用法如下:
操作
句法
结果
选择列
df[col]
Series
用标签选择行
df.loc[label]
Series
用整数位置选择行
df.iloc[loc]
Series
行切片
df[5:
10]
DataFrame
用布尔向量选择行
df[bool_vec]
DataFrame
选择行返回Series,索引是DataFrame的列:
In [83]:
df.loc['b']
Out[83]:
one 2
bar 2
flag False
foo bar
one_trunc 2
Name:
b, dtype:
object
In [84]:
df.iloc[2]
Out[84]:
one 3
bar 3
flag True
foo bar
one_trunc NaN
Name:
c, dtype:
object
高级索引、切片技巧,请参阅索引。
重建索引介绍重建索引/遵循新标签集的基础知识。
数据对齐和运算
DataFrame对象可以自动对齐列与索引(行标签)的数据。
与上文一样,生成的结果是列和行标签的并集。
In [85]:
df = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D'])
In [86]:
df2 = pd.DataFrame(np.random.randn(7, 3), columns=['A', 'B', 'C'])
In [87]:
df + df2
Out[87]:
A B C D
0 0.045691 -0.014138 1.380871 NaN
1 -0.955398 -1.501007 0.037181 NaN
2 -0.662690 1.534833 -0.859691 NaN
3 -2.452949 1.237274 -0.133712 NaN
4 1.414490 1.951676 -2.320422 NaN
5 -0.494922 -1.649727 -1.084601 NaN
6 -1.047551 -0.748572 -0.805479 NaN
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
9 NaN NaN NaN NaN
DataFrame和Series之间执行操作时,默认操作是在DataFrame的列上对齐Series的索引,按行执行广播)操作。
例如:
In [88]:
df - df.iloc[0]
Out[88]:
A B C D
0 0.000000 0.000000 0.000000 0.000000
1 -1.359261 -0.248717 -0.453372 -1.754659
2 0.253128 0.829678 0.010026 -1.991234
3 -1.311128 0.054325 -1.724913 -1.620544
4 0.573025 1.500742 -0.676070 1.367331
5 -1.741248 0.781993 -1.241620 -2.053136
6 -1.240774 -0.869551 -0.153282 0.000430
7 -0.743894 0.411013 -0.929563 -0.282386
8 -1.194921 1.320690 0.238224 -1.482644
9 2.293786 1.856228 0.773289 -1.446531
时间序列是特例,DataFrame索引包含日期时,按列广播:
In [89]:
index = pd.date_range('1/1/2000', periods=8)
In [90]:
df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))
In [91]:
df
Out[91]:
A B C
2000-01-01 -1.226825 0.769804 -1.281247
2000-01-02 -0.727707 -0.121306 -0.097883
2000-01-03 0.695775 0.341734 0.959726
2000-01-04 -1.110336 -0.619976 0.149748
2000-01-05 -0.732339 0.687738 0.176444
2000-01-06 0.403310 -0.154951 0.301624
2000-01-07 -2.179861 -1.369849 -0.954208
2000-01-08 1.462696 -1.743161 -0.826591
In [92]:
type(df['A'])
Out[92]:
Pandas.core.series.Series
In [93]:
df - df['A']
Out[93]:
2000-01-01 00:
00:
00 2000-01-02 00:
00:
00 2000-01-03 00:
00:
00 2000-01-04 00:
00:
00 ... 2000-01-08 00:
00:
00 A B C
2000-01-01 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-03 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-04 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-05 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-06 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-07 NaN NaN NaN NaN ... NaN NaN NaN NaN
2000-01-08 NaN NaN NaN NaN ... NaN NaN NaN NaN
[8 rows x 11 columns]
df - df['A']
已弃用,后期版本中会删除。
实现此操作的首选方法是:
df.sub(df['A'], axis=0)
有关匹配和广播操作的显式控制,请参阅二进制操作。
标量操作与其它数据结构一样:
In [94]:
df * 5 + 2
Out[94]:
A B C
2000-01-01 -4.134126 5.849018 -4.406237
2000-01-02 -1.638535 1.393469 1.510587
2000-01-03 5.478873 3.708672 6.798628
2000-01-04 -3.551681 -1.099880 2.748742
2000-01-05 -1.661697 5.438692 2.882222
2000-01-06 4.016548 1.225246 3.508122
2000-01-07 -8.899303 -4.849247 -2.771039
2000-01-08 9.313480 -6.715805 -2.132955
In [95]:
1 / df
Out[95]:
A B C
2000-01-01 -0.815112 1.299033 -0.780489
2000-01-02 -1.374179 -8.243600 -10.216313
2000-01-03 1.437247 2.926250 1.041965
2000-01-04 -0.900628 -1.612966 6.677871
2000-01-05 -1.365487 1.454041 5.667510
2000-01-06 2.479485 -6.453662 3.315381
2000-01-07 -0.458745 -0.730007 -1.047990
2000-01-08 0.683669 -0.573671 -1.209788
In [96]:
df ** 4
Out[96]:
A B C
2000-01-01 2.265327 0.351172 2.694833
2000-01-02 0.280431 0.000217 0.000092
2000-01-03 0.234355 0.013638 0.848376
2000-01-04 1.519910 0.147740 0.000503
2000-01-05 0.287640 0.22
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Pandas 数据结构 DataFrame 常见 操作