Numpy的一个优点就是提供了快速的元素级别操作,比如算术运算以及其他复杂操作。DataFrame继承 了大部分功能。
Pandas在这些函数的基础上提供了更为高级的功能。比如,一元运算不修改行索引和列索引;而对于二元操作,Pandas会自动对齐行索引。
索引不变的通用函数
由于Pandas是基于Numpy搭建的,所以任何Numpy的通用函数都适用于Pandas
Series对象和DataFrame对象。
首先,我们创建一个Series对象和DataFrame对象。
import pandas as pd
import numpy as np
rng = np.random.RandomState(42)
ser = pd.Series(rng.randint(0, 10, 4))
0 6
1 3
2 7
3 4
dtype: int64
创建DataFrame
df = pd.DataFrame(rng.randint(0, 10, (3, 4)),
columns=['A', 'B', 'C', 'D'])
image.png
如果将Numpy通用函数作用与Pandas对象上,得到的结果索引保持不变:
np.exp(ser)
结果为:
0 403.428793
1 20.085537
2 1096.633158
3 54.598150
dtype: float64
更复杂的例子:
np.sin(df * np.pi / 4)
image.png
对齐索引的通用函数
对于二元操作,Pandas会自动对齐索引之后然后进行运算。
Series中的索引对齐
首先,创建两个Series对象,然后进行合并操作:
area = pd.Series({'Alaska': 1723337, 'Texas': 695662,
'California': 423967}, name='area')
population = pd.Series({'California': 38332521, 'Texas': 26448193,
'New York': 19651127}, name='population')
通过除法运算计算人 口密度:
population / area
结果为:
Alaska NaN
California 90.413926
New York NaN
Texas 38.018740
dtype: float64
结果索引是两者的并集:
area.index | population.index
# Index(['Alaska', 'California', 'New York', 'Texas'], dtype='object')
如果某个DataFrame没有对应的键值,则赋值为NaN。对于其他的二元算术操作,结果都是类似的:
A = pd.Series([2, 4, 6], index=[0, 1, 2])
B = pd.Series([1, 3, 5], index=[1, 2, 3])
A + B
结果为:
0 NaN
1 5.0
2 9.0
3 NaN
dtype: float64
如果填充NaN不是自己想要的结果,还可以通过调用方法并指定填充值:
A.add(B, fill_value=0)
输出为:
0 2.0
1 5.0
2 9.0
3 5.0
dtype: float64
DataFrame中的索引对齐
当操作DataFrame时,会通水对齐行和列。
A = pd.DataFrame(rng.randint(0, 20, (2, 2)),
columns=list('AB'))
B = pd.DataFrame(rng.randint(0, 10, (3, 3)),
columns=list('BAC'))
A+B:
A + B
image.png
还可以指定填充值:
fill = A.stack().mean()
A.add(B, fill_value=fill)
结果为:
image.png同时操作DataFrame和Series的通用函数。
当同时操作DataFrame和Series对象时,行和列索引保持对齐。
df = pd.DataFrame(A, columns=list('QRST'))
df - df.iloc[0]
结果为:
image.png上述操作是行级别的,如果需要列级别的操作,需要指定aixs:
df.subtract(df['R'], axis=0)
image.png
网友评论