我不知道如何在这里制定一个好的标题。
情况是我有两个想要合并的数据框:
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
我对如何解决这个问题一无所知。
答案 0 :(得分:3)
获得合并后的数据框后,您可以groupby
列A
和ID
,然后只需将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 []