动手学数据分析第二章笔记2

动手学数据分析第二章第二节

数据合并

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里也有类似的功能
groupby机制
首先根据提供的键拆分成多个组,再进行聚合运算
可以分组之后只选一个属性聚合

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

但是传入自定义速度会比自带经过优化的函数慢许多,这是因为在构造中间分组数据块时存在非常大的开销(函数调用、数据重排等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值