我有兩個需要逐行匹配的資料框。在發生匹配的地方,我需要增加 df1 中欄位的值 1。df2 與 df1 有多個匹配項。我不想合并資料框,只需根據與 df2 的匹配更新 df1。
我腦海中的基本邏輯是讀取df1的第一行,然后嘗試將TRANID與df2的每一行匹配。發生匹配時,將 1 添加到 NUMINSTS 值。然后回圈回來,對 df1 的下一行執行相同的操作。我只是不確定如何在 Python/Pandas 中解決這個問題。
我是一名老 COBOL 程式員,正在學習 Python/Pandas,因此非常感謝任何幫助。
Input Data
df1:
TRANID NUMINSTS
60000022 22
60000333 6
70000001 15
70000233 60
df2:
TRANID
60000333
70000233
70000233
Output
df3:
TRANID NUMINSTS
60000022 22
60000333 7 #incremented by 1
70000001 15
70000233 62 #incremented by 2
uj5u.com熱心網友回復:
我們可以根據 df2 中的值進行過濾,并不斷添加或更改 df1 中的值。
import pandas as pd
df1 = pd.DataFrame({"TRAINID":["60000022", "60000333", "70000001", "70000233"], "NUMINSTS":[22,6,15,60]})
df2 = pd.DataFrame({"TRAINID":[ "60000333", "70000233", "70000233"]})
def add_num(df1,df2):
for id in list(df2["TRAINID"]):
df1.loc[df1["TRAINID"] == id, "NUMINSTS"] = 1
return df1
df3 = add_num(df1,df2)
print(df3)
uj5u.com熱心網友回復:
你想要兩種情況:
- Tranid 存在于 df1
- df1 中不存在 Tranid。
這是您的代碼:
import pandas as pd
df1=pd.DataFrame({'tranid':[1,2,3],'numinst':[2,4,6]})
df2=pd.DataFrame({'tranid':[1,2,4]})
tranvalues=df1['tranid']
for i in range(len(df2)):
if df2['tranid'][i] in tranvalues:
df1['numinst'][df1['tranid']==df2['tranid'][i]]=df1['numinst'] 1
else:
df1.loc[len(df1.index)]=[df2['tranid'][i],1]
uj5u.com熱心網友回復:
你可以試試:
df1 = pd.DataFrame({'TRANID':[60000022, 60000333, 70000001, 70000233],
'NUMINSTS':[22,6,15,60]})
df1:
TRANID NUMINSTS
0 60000022 22
1 60000333 6
2 70000001 15
3 70000233 60
df2 = pd.DataFrame({'TRANID':[60000333, 70000233, 70000233]})
df2:
TRANID
0 60000333
1 70000233
2 70000233
從 df2 構建一個包含 TRANID 值計數的字典:
d = df2['TRANID'].value_counts().to_dict()
從 df1 復制 df3 并更新 NUMINSTS 列,如果 TRANID 在上述字典中,則按值計數遞增,否則保持不變:
df3 = df1.copy()
df3['NUMINSTS'] = df3.apply(
lambda row:
row['NUMINSTS'] d[row['TRANID']] if row['TRANID'] in d else row['NUMINSTS'], axis=1)
如果您不想要不匹配的行,您可以None像下面這樣替換,然后洗掉帶有None值的行:
df3['NUMINSTS'] = df3.apply(
lambda row:
row['NUMINSTS'] d[row['TRANID']] if row['TRANID'] in d else None, axis=1)
df3.dropna(subset=['NUMINSTS'], inplace=True)
df3['NUMINSTS'] = df3['NUMINSTS'].astype(int)
df3.reset_index(inplace=True,drop=True)
輸出df3:
TRANID NUMINSTS
0 60000333 7
1 70000233 62
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462006.html
