我對 Pandas 還很陌生,因此我不知道是否有一種智能有效的方法來執行以下操作——例如,一些merge我不知道的類似操作。我希望你們中的一些人能提供幫助。
假設我有兩個資料框,其中每一行包含 1)該資料框唯一的 ID,以及 2)該 ID 持有的專案串列。例如:
df1 = pd.DataFrame(data={'id': ['ID1','ID2'], 'items': [['a','b'],['a','b']]})
df2 = pd.DataFrame(data={'id': ['ID1','ID3'], 'items': [['a','c'],['a','d']]})
我想將這些資料框組合起來得到 and 的組合資訊df1,df2所以得到:
df3 = pd.DataFrame(data={'id': ['ID1','ID2','ID3'], 'items': [['a','b','c'],['a','b'],['a','d']]})
因此,df3只是df1 1) 其中ID1還包含 2) 中的專案c已df2附加包含 的行ID3。
我該怎么辦?
uj5u.com熱心網友回復:
第一個想法是在外部mergeby之前展平串列,然后通過洗掉重復和缺失值DataFrame.explode重塑 by ,最后聚合s:DataFrame.meltlist
df = (df1.explode('items').merge(df2.explode('items'), on="id", how="outer")
.melt('id')
.drop_duplicates(['id','value'])
.dropna(subset=['value'])
.groupby('id')['value'].agg(list)
.reset_index(name='items')
)
print (df)
id items
0 ID1 [a, b, c]
1 ID2 [a, b]
2 ID3 [a, d]
或者是可能的Series.explode之后merge:
df = (df1.merge(df2, on="id", how="outer")
.set_index('id')
.stack()
.explode()
.groupby(level=0)
.agg(lambda x: list(set(x)))
.reset_index(name='items'))
print (df)
id items
0 ID1 [c, b, a]
1 ID2 [b, a]
2 ID3 [d, a]
uj5u.com熱心網友回復:
可能不是最漂亮的解決方案,但也許有幫助:
df_final = df1.merge(df2, on="id", how="outer")
df_final["items_x"] = df_final["items_x"].apply(lambda x: x if isinstance(x, list) else [])
df_final["items_y"] = df_final["items_y"].apply(lambda x: x if isinstance(x, list) else [])
df_final["items"] = (df_final["items_x"] df_final["items_y"]).apply(lambda x: list(set(x)))
df_final = df_final.drop(["items_x", "items_y"], axis=1)
df_final
輸出:
id items
0 ID1 [c, a, b]
1 ID2 [a, b]
2 ID3 [d, a]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/415719.html
標籤:
