Pandas数据结构—合并、连接、修补、去重、替换
一、合并(一) merge
二、合并(二)join
三、连接 concat
四、修补 combine_first、updata
五、去重 duplicated
六、替换 replace
一、合并(一)-merge
merge有点类似vlookup,但是比vlookup更灵活。
merge的参数有很多:
left, right, how=‘inner’, on=None, left_on=None, right_on=None,left_index=False, right_index=False,
sort=True, suffixes=(’_x’, ‘_y’), copy=True, indicator=False
df1 = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df3 = pd.DataFrame({
'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df4 = pd.DataFrame({
'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 可以看到df1和df2都有key这个列,并且数据都相同。
print(df1)
print('--------------------------------')
print(df2)
print('--------------------------------')
# df3和df4都有key1列和key2列,但是有一部分数据不同。
print(df3)
print('--------------------------------')
print(df4)
print('--------------------------------')
运行结果如下:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
--------------------------------
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3
--------------------------------
key1 key2 A B
0 K0 K0 A0 B0
1 K0 K1 A1 B1
2 K1 K0 A2 B2
3 K2 K1 A3 B3
--------------------------------
key1 key2 C D
0 K0 K0 C0 D0
1 K1 K0 C1 D1
2 K1 K0 C2 D2
3 K2 K0 C3 D3
--------------------------------
1、参数 left 、right、on
left:准备合并的第一组数据
right:准备合并的第二组数据
on:参考键
# 通过设置参数on的值来确定合并的参考键。也就说以什么作为参考。on = 'key'就是以key作为参考。
print('将df1和df2进行合并,合并的原则是根据参考键key: \n',pd.merge(df1, df2, on = 'key'))
print('--------------------------------')
# df3和df4的key1和key2的第一行数据相同,所以进行合并。
# df3的key1和key2的第二行数据,在df4的key1和key2列中没有相同的数据,所以不进行合并。
# 注意:df3的key1和key2的第三行数据,和df4的key1和key2列中有两行相同的数据,所以会进行两次合并。
# # df3的key1和key2的第四行数据,在df4的key1和key2列中没有相同的数据,所以不进行合并。
print(pd.merge(df3, df4, on = ['key1','key2']))
运行结果如下:
将df1和df2进行合并,合并的原则是根据参考键key:
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
--------------------------------
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1
2 K1 K0 A2 B2 C2 D2
2、参数how
how:合并方式
# how = 'inner':表示取的是交集
print(pd.merge(df3, df4,on=['key1','key2'], how = 'inner'))
print('--------------------------------')
# how = 'outer':表示取的是并集,如果数据缺失就用NaN填充
print(pd.merge(df3, df4, on=['key1','key2'], how = 'outer'))
print('--------------------------------')
# how = 'left':表示将第一组准备合并的数据为参考进行合并(本例中是df3),如果数据缺失就用NaN填充
print(pd.merge(df3, df4, on=['key1','key2'], how = 'left'))
print('--------------------------------')
# how = 'right':表示将第二组准备合并的数据为参考进行合并(本例中是df4),如果数据缺失就用NaN填充
print(pd.merge(df3, df4, on=['key1','key2'], how = 'right'))
运行结果如下:
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1
2 K1 K0 A2 B2 C2 D2
--------------------------------
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
5 K2 K0 NaN NaN C3 D3
--------------------------------
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
--------------------------------
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1
2 K1 K0 A2 B2 C2 D2
3 K2 K0 NaN NaN C3 D3
3、参数 left_on, right_on, left_index, right_index
当键不同时,可以通过left_on, right_on分别设置左键与右键。当键相同时,直接用on
当两组数据的列名不同时可以使用left_index, right_index来进行合并操作。
left_on, right_on, left_index, right_index可以进行相互的组合:
left_on + right_on, left_on + right_index, left_index + right_on, left_index + right_index
df1 = pd.DataFrame({
'xkey':list('abcdefs'),
'data1':range(7)})
df2 = pd.DataFrame({
'ykey':list('abd'),
'date2':range(3)})
print(df1)
print('--------------------------------')
print(df2)
print('--------------------------------')
# 通过left_on='xkey', right_on='ykey'分别设置了合并所需的左键和右键。
# 在合并的时候,依然会比较这两个键里的具体数据是否有相同的,如果有就进行合并。
print(pd.merge(df1, df2, left_on='xkey', right_on='ykey'))
print('--------------------------------')
df3 = pd.DataFrame({
'key':list('abcdfeg'),
'data1':range(7)})
df4 = pd.DataFrame({
'data2':range(10,15)},
index = list('abcde'))
print(df3)
print('--------------------------------')
print(df4)
print('--------------------------------')
# df3有key和data1两列,df4除了index就只有data2一列,但是index和df3的key有部分相同。
# 将df3设置成以‘key’为键,而df4设置成以index为键。
# left_index:为True时,第一组数据是以index为键,默认False
# right_index:为True时,第二组数据是以index为键,默认False
print(pd.merge(df3, df4, left_on='key', right_index=True))
运行结果如下:
xkey data1
0 a 0
1 b 1
2 c 2