我需要根據某些條件加入以下資料框。
df1:
Id Value
[101,102,103] 10001
[101,102,104] 10000
[101,102,105] 10002
[101,107,105] 10003
df2:
Id Product_Name
[101,102,103,104] Shoe
[101,102,109,104] jeans
[101,105,102,108] make-up
[101,105,106,118] shirt
df_output
Id Value Product_Name
[101,102,103] 10001 Shoe -- Every value present in df2.Id list
[101,102,104] 10000 Jeans -- Every value present in df2.Id list
[101,102,105] 10002 Make-Up -- Every value present in df2.Id list
[101,107,105] 10003 NaN -- Not Every Value matches in df2.Id list.
我需要根據 Id 列加入兩個資料框 df1、df2,但每個元素都應該在 df.Id 串列中,這就是我們認為它匹配的時候。
Python Code:
import pandas as pd
df_output = pd.merge(df1, df2, on='Id', how='left')
uj5u.com熱心網友回復:
雖然這不是一個高效的解決方案,但您可以使用一些sets 來解決這個問題。
matches = df1["Id"].apply(set) <= df2["Id"].apply(set)
out = df1.copy()
out.loc[matches, df2.columns.difference(["Id"])] = df2
print(out)
Id Value Product_Name
0 [101, 102, 103] 10001 Shoe
1 [101, 102, 104] 10000 jeans
2 [101, 102, 105] 10002 make-up
3 [101, 107, 105] 10003 NaN
在上面的片段中:
matches = df1["Id"].apply(set) <= df2["Id"].apply(set)回傳一個布林值Series,如果 df1['Id'] 中每一行的內容在 df2['Id'] 中的相應行中,則回傳 True,否則回傳 Falsemerge我們可以簡單地在上述布林值上對齊 2 個 DataFrame,而不是執行實際操作Series
如果您想在兩個資料幀中針對彼此測驗 Id,您可以獲取兩個資料幀的笛卡爾積,通過設定的條件將其過濾到內部連接,然后附加回任何丟失的左連接鍵。
out = (
pd.merge(df1, df2, how="cross")
.loc[lambda df: df["Id_x"].map(set) <= df["Id_y"].map(set)]
.pipe(
lambda df: df.append(
df1.loc[~df1["Id"].isin(df["Id_x"])].rename(columns={"Id": "Id_x"})
)
)
.reset_index(drop=True)
)
print(out)
Id_x Value Id_y Product_Name
0 [101, 102, 103] 10001 [101, 102, 103, 104] Shoe
1 [101, 102, 104] 10000 [101, 102, 103, 104] Shoe
2 [101, 102, 104] 10000 [101, 102, 109, 104] jeans
3 [101, 102, 105] 10002 [101, 105, 102, 108] make-up
4 [101, 107, 105] 10003 NaN NaN
uj5u.com熱心網友回復:
IIUC,你可以在axis=1; 然后檢查是否df1.Id是df2.Id每一行的子集,并where根據檢查結果用于屏蔽“Product_Name”。
out = pd.concat([df1, df2], axis=1)
out['Product_Name'] = out['Product_Name'].where(out['Id'].apply(lambda x: set(x.iat[0]).issubset(x.iat[1]), axis=1))
out = out.loc[:, ~out.columns.duplicated()]
輸出:
Id Value Product_Name
0 [101, 102, 103] 10001 Shoe
1 [101, 102, 104] 10000 jeans
2 [101, 102, 105] 10002 make-up
3 [101, 107, 105] 10003 NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446263.html
標籤:Python python-3.x 熊猫 数据框
