动手学数据分析第二章第二节
数据合并
pandas常用的数据合并的方法:
- pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来,就是数据库的join操作。
- pandas.concat可以沿着一条轴将多个对象堆叠到一起
- 实例方法combine_first可以将重复数据拼接在一起,用一个对象中的值填充另一个对象中的缺失值。
pandas.merge
merge是数据库风格的合并操作,常用参数如下:
pd.merge(left,right,on='key',how='inner',on='key',left_on='l_key',
right_on='r_key',left_index=False,right_index=False,
suffixes=('_left','_right'))
left,right:要合并的左边表和右边表
how:可选’inner’内连接,‘outer’外连接,‘left’左连接,‘right’右连接
on:用于连接的键名,必须在两个表中都存在,不选时即以两表的交集为连接键
left_on,right_on:不常用,左边和右边表用作连接的键
left_index,right_index:将左/右侧索引作为连接键,默认为False
suffixes:用于区分共同列,追加到共同列末尾,默认为(’_x’,’_y)
join用法和merge类似,但是是Dataframe成员方法
pandas.concat
concat可以连接Series,默认在axis=0上连接(扩展列)
pd.concat(objs,axis=0,join='outer',join_axes=['a','b','c',],keys=['a','b'],
names=['upper','lower'],ignore_index=True)
objs是必须参数,其他均是可选参数,objs输入要连接的表
axis=0连接列
join=‘outer’/'inner’求并集或交集
join_axes指定其他轴上的索引,比如axis=1时即指定行索引
keys在连接轴上指定一个层次化索引
ignore_index在两个连接的表行和列都不同时可用
combine_first()
两个数组可能有相同索引,但是值不同,这样不能单纯用merge或者concat,这里用combine_first()成员方法,对Series或Dataframe都适用,具体作用这里可以看成用另一个数组给当前数组打补丁
In [115]: df1 = pd.DataFrame({'a': [1., np.nan, 5., np.nan],
.....: 'b': [np.nan, 2., np.nan, 6.],
.....: 'c': range(2, 18, 4)})
In [116]: df2 = pd.DataFrame({'a': [5., 4., np.nan, 3., 7.],
.....: 'b': [np.nan, 3., 4., 6., 8.]})
In [117]: df1
Out[117]:
a b c
0 1.0 NaN 2
1 NaN 2.0 6
2 5.0 NaN 10
3 NaN 6.0 14
In [118]: df2
Out[118]:
a b
0 5.0 NaN
1 4.0 3.0
2 NaN 4.0
3 3.0 6.0
4 7.0 8.0
In [119]: df1.combine_first(df2)
Out[119]:
a b c
0 1.0 NaN 2.0
1 4.0 2.0 6.0
2 5.0 4.0 10.0
3 3.0 6.0 14.0
4 7.0 8.0 NaN
数据聚合
这一部分主要运用groupby函数,类似数据库中的分组查询机制,pandas里也有类似的功能
首先根据提供的键拆分成多个组,再进行聚合运算
可以分组之后只选一个属性聚合
b=df.groupby('Sex')[['Fare']].mean()
b
Fare
Sex
female 44.479818
male 25.523893
同样的功能也可以这样写:
a=df['Survived'].groupby(df['Sex']).value_counts()
a
Sex Survived
female 1 233
0 81
male 0 468
1 109
Name: Survived, dtype: int64
也可以适用agg()函数
df.groupby('Sex')['Fare'].agg(['mean','count'])
也可传入自定义函数:
In [54]: def peak_to_peak(arr):
....: return arr.max() - arr.min()
In [55]: grouped.agg(peak_to_peak)
Out[55]:
data1 data2
key1
a 2.170488 1.300498
b 0.036292 0.487276
但是传入自定义速度会比自带经过优化的函数慢许多,这是因为在构造中间分组数据块时存在非常大的开销(函数调用、数据重排等)。