我有 2 個要進行比較的資料框。請找到下面的資訊,并感謝任何幫助。
df 1 顯示ID之間的關系
df1 =
IDA IDB Relationship
A100 A200 Parent
A200 A500 Spouse
A111 A112 Child
A112 A111 Parent
df2 包含一個 ID 串列,如果 ID 的 Party 1 和 Party 2 之間存在任何形式的關系,我將對照 df1 檢查并映射關系(如果有多個關系,則為第一個實體)
df2 =
Sender Receiver
[A900,A200] [A500,A220]
[A150,A100] [A400]
[A400,A112] [A500]
[A700,A112] [A111,A001]
這是我的預期輸出和解釋
Output =
Sender Receiver Relationship
[A900,A200] [A500,A220] Spouse #A200 and A500
[A150,A100] [A400] NAN #No match
[A400,A112] [A500] NAN #No match
[A700,A112] [A111,A001] Parent #A112 and A111
uj5u.com熱心網友回復:
我無法測驗它,因為您沒有提供資料樣本,但類似的東西應該可以作業:
Output = df2.copy()
detected_relations = []
for transaction in df2.iterrows:
Receiver = transaction.Receiver
Sender = transaction.Sender
df = df1[(df1.IDA.isin(Sender) & df1.IDB.isin(Receiver)) | (df1.IDB.isin(Sender) & df1.IDA.isin(Receiver))]
detected_relations = detected_relations df.Relationship
Outpout["Relationship"] = detected_relations
uj5u.com熱心網友回復:
您可以將資訊提取到本機 python 資料結構中,然后將其與原始資料合并DataFrames-
要做到這一點 - 我首先會在 df2 中的Sender和Receiver列中配對 -
def make_pairs(row):
senders = row['Sender'].replace("[", "").replace("]", "").split(",")
receivers = row['Receiver'].replace("[", "").replace("]", "").split(",")
pairs = [(s, r) for s in senders for r in receivers]
return pairs
send_receive_combinations = df2.apply(make_pairs, axis=1).to_dict()
然后將IDA和IDBfrom的組合映射df1到字典中:
rels = {(ida, idb): rel for ida, idb, rel in df1.values}
然后可以使用 dict 理解(甚至是簡單的 for 回圈)對感興趣的值進行子集化
rel_pairs = {key: rels[pair] for key, combination in send_receive_combinations.items() for pair in combination if pair in rels}
最后,我們可以將其dict與df2-
df2['relationship'] = df2.index
df2['relationship'] = df2['relationship'].map(rel_pairs)
print(df2)
Sender Receiver relationship
#0 [A900,A200] [A500,A220] Spouse
#1 [A150,A100] [A400] NaN
#2 [A400,A112] [A500] NaN
#3 [A700,A112] [A111,A001] Parent
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/414816.html
標籤:
上一篇:將特定字串從一列移動到另一列
