如果pandas merge找到多个匹配项,请将值行写入一个字段

时间:2018-04-30 11:59:26

标签: python pandas merge

我不知道如何在这里制定一个好的标题。

情况是我有两个想要合并的数据框:

df1 = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'ID'])
df2 = pd.DataFrame([[3, 2], [3, 3], [4, 6]], columns=['ID', 'values'])

所以我做了一个:

pd.merge(df1, df2, on="ID", how="left")

导致:

   A   ID    values
0  1   2     NaN
1  1   3     2.0
2  1   3     3.0
3  4   6     NaN

我想要的是A和ID的任何组合只出现一次。如果有多个,如上例所示,它应该采用相应的值并将它们合并到值的列表(?)中。所以结果应该是这样的:

   A   ID    values
0  1   2     NaN
1  1   3     2.0, 3.0
2  4   6     NaN

我对如何解决这个问题一无所知。

2 个答案:

答案 0 :(得分:3)

获得合并后的数据框后,您可以groupbyAID,然后只需将list应用到values列即可汇总结果列入每个组的列表:

import pandas as pd

df1 = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'ID'])
df2 = pd.DataFrame([[3, 2], [3, 3], [4, 6]], columns=['ID', 'values'])

merged = pd.merge(df1, df2, on="ID", how="left") \
           .groupby(['A', 'ID'])['values'] \
           .apply(list) \
           .reset_index()

print(merged)

打印:

   A  ID      values
0  1   2       [nan]
1  1   3  [2.0, 3.0]
2  4   6       [nan]

答案 1 :(得分:2)

您可以使用

merged = pd.merge(df1, df2, on="ID", how="left") \
           .groupby(['A', 'ID'])['values'] \
           .apply(list) \
           .reset_index()

如asongtoruin罚款答案,但你可能想要考虑只有None的特殊情况(由于合并),在这种情况下你可以使用

    >>> df['values'].groupby([df.A, df.ID]).apply(lambda g: [] if g.isnull().all() else list(g)).reset_index()
    A   ID  values
0   1   2   []
1   1   3   [2.0, 3.0]
2   4   6   []