我正在尝试组合两个数据帧,这两个数据帧都包含一列重复值,但重复次数不同。
import pandas as pd
df1 = pd.DataFrame({'col1':[1, 1, 2, 2, 3, 3, 3],
'col2':[1.1, 1.3, 2.1, 2.3, 3.1, 3.3, 3.5]})
df2 = pd.DataFrame({'col1':[1, 2, 2, 3, 3, 3],
'col2':[1.2, 2.2, 2.4, 3.2, 3.4, 3.6]})
df1
col1 col2
0 1 1.1
1 1 1.3
2 2 2.1
3 2 2.3
4 3 3.1
5 3 3.3
6 3 3.5
df2
col1 col2
0 1 1.2
1 2 2.2
2 2 2.4
3 3 3.2
4 3 3.4
5 3 3.6
所需的输出将是例如:
desired_result = pd.DataFrame({'col1': [1, 1, 2, 2, 3, 3, 3],
'col2_x':[1.1, 1.3, 2.1, 2.3, 3.1, 3.3, 3.5],
'col2_y':[1.2, 'NaN' , 2.2, 2.4, 3.2, 3.4, 3.6]})
desired_result
col1 col2_x col2_y
0 1 1.1 1.2
1 1 1.3 NaN
2 2 2.1 2.2
3 2 2.3 2.4
4 3 3.1 3.2
5 3 3.3 3.4
6 3 3.5 3.6
问题在于如何在col1上组合包含重复值的两个数据帧并且不可能直接匹配(并且也不是必需的)的模糊性。
答案 0 :(得分:1)
您可以groupby
和水平 - concat
每个群组。在那之后,它只是一些列/索引操作:
In [75]: merged = df1.groupby(df1.col1).apply(lambda g: pd.concat([g[['col2']].reset_index(), df2[['col2']][df2.col1 == g.col1.values[0]].reset_index()], axis=1))
In [76]: merged.columns = ['_', 'col2_x', '__', 'col2_y']
In [77]: merged.reset_index()[['col1', 'col2_x', 'col2_y']]
Out[77]:
col1 col2_x col2_y
0 1 1.1 1.2
1 1 1.3 NaN
2 2 2.1 2.2
3 2 2.3 2.4
4 3 3.1 3.2
5 3 3.3 3.4
6 3 3.5 3.6