2.合并数据
2.1 merge合并数据
python中的merge函数是通过一个或多个键将两个DataFrame按行合并起来,与SQL中的join用法类似。
merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=Flase, right_index=Flase, sort=Flase, suffiex=('_x', '_y'), copy=True, indicator=Flase, validate=None)
参数 | 说明 |
---|---|
left | 参与合并的左边的DataFrame |
right | 参与合并的右边的DataFrame |
how | 连接方式:inner, left, right, outer【交集,左,右,并集】 |
on | 用于连接的列名 |
left_on | 左侧DataFrame中用于连接键的列 |
right_on | 右侧DataFrame用于连接键的列 |
left_index | 左侧DataFrame行索引作为连接键 |
right_index | 右侧DataFrame行索引作为连接键 |
sort | 合并后对数据进行排序,默认True |
suffiex | 合并后对重复数据进行重命名 |
#merge默认合并
from IPython.core.display import display
price = pd.DataFrame({'fruit':['apple','grape','orange','orange'],
'price':[8,7,9,11]})
amount = pd.DataFrame({'fruit':['apple','grape','orange'],'amout':[5,11,8]})
display(price,amount,pd.merge(price,amount))
》》》》》》结果:
fruit price
0 apple 8
1 grape 7
2 orange 9
3 orange 11
fruit amout
0 apple 5
1 grape 11
2 orange 8
fruit price amout
0 apple 8 5
1 grape 7 11
2 orange 9 8
3 orange 11 8
两个df都是有fruit列的,默认按照该列合并,方式默认是inner内连接,返回交集,即 pd.merge(amount,price,on="fruit",how="inner")
pd.merge(price,amount,left_on='fruit', right_on='fruit',how='left')
也可以通过多个键连接
left = pd.DataFrame({'key1':[1,2,3,4], 'key2':['a','b','a','d'], 'value1':range(4) })
right = pd.DataFrame({'key1':[1,2,3], 'key2':['a','b','c'], 'value2':range(3) })
display(left, right, pd.merge(left, right , on=['key1','key2'], how='left'))
key1 key2 value1
0 1 a 0
1 2 b 1
2 3 a 2
3 4 d 3
key1 key2 value2
0 1 a 0
1 2 b 1
2 3 c 2
key1 key2 value1 value2
0 1 a 0 0.0
1 2 b 1 1.0
2 3 a 2 NaN
3 4 d 3 NaN
重复列名的处理:人为修改或者merger
函数的参数suffixes
#inner内连接求交集
print(pd.merge(left, right, on='key1'))
print(pd.merge(left, right, on='key1', suffixes=('_left','_right')))
key1 key2_x value1 key2_y value2
0 1 a 0 a 0
1 2 b 1 b 1
2 3 a 2 c 2
key1 key2_left value1 key2_right value2
0 1 a 0 a 0
1 2 b 1 b 1
2 3 a 2 c 2
2.2concat数据连接
如果合并的数据之间没有连接键, 则使用pandas
的concat
方法。默认情况下会按行的方向堆叠数据;如果在列向上连接,设置axis=1
即可。
#pandas 的concat方法连接没有连接键的数据 默认是连接外连接求并集 可以传入参数join='inner'实现内连接 join_axis指定使用索引顺序 axis=1在列向上连接
# concat连接Series
s1 = pd.Series([0,1], index=['a','b'])
s2 = pd.Series([2,3,4], index=['a','c','d'])
s3 = pd.Series([6,7], index=['e','f'])
print(pd.concat([s1, s2, s3]))
a 0
b 1
a 2
c 3
d 4
e 6
f 7
dtype: int64
#concat连接DataFrame
df1 = pd.DataFrame({'key1':[1,2,3,4], 'value1':['a','b','c','d']})
df2 = pd.DataFrame({'key1':[1,0,7,9], 'value2':['a','b','c','d']})
print(pd.concat([df1, df2], axis=0))
print(pd.concat([df1,df2], axis=1))
key1 value1 value2
0 1 a NaN
1 2 b NaN
2 3 c NaN
3 4 d NaN
0 1 NaN a
1 0 NaN b
2 7 NaN c
3 9 NaN d
key1 value1 key1 value2
0 1 a 1 a
1 2 b 0 b
2 3 c 7 c
3 4 d 9 d
2.3combine_first合并数据
如果要合并的两个DF存在重复索引,则使用merger和concat都无法正确合并,此时用combine_first
方法。
display(s6, s5)
s6.combine_first(s5)
0 1
a 0 0
b 1 5
0 1
a 0.0 0
b 1.0 5
f NaN 5
g NaN 6
0 1
a 0.0 0.0
b 1.0 5.0
f NaN 5.0
g NaN 6.0