在包含重复值

时间:2016-08-11 08:24:02

标签: python pandas dataframe

我正在尝试组合两个数据帧,这两个数据帧都包含一列重复值,但重复次数不同。

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上组合包含重复值的两个数据帧并且不可能直接匹配(并且也不是必需的)的模糊性。

1 个答案:

答案 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