我需要在第二列中按條件在字串中進行子字串搜索。我有2個資料框:
df1 = {'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical","VALVE, OVERBOARD, BUTTERFLY"],
'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU","VALVE"],
}
df2 = {'N_Product': ["VALVE", "VALVE","VALVE", "PUMP", "GEEKU"],
'M_Product': ["PRESSURE", "ELECTRICAL","", "", "ELECTRICAL"],
}
df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)
您需要比較兩個資料框的 N_Product 列中的值,如果它們匹配,則從 M_Product 列中搜索相應的值(例如,對于 Valve - 有 3 個匹配項:“PRESSURE”、“描述列中的 ELECTRICAL" 和 ""(空值),如果存在,則將其添加到 Result 列。要在字串中搜索子字串,我使用以下代碼:
c = df2['M_Product'].astype(str).to_list()
def matcher(x):
for i in c:
if i.lower() in x.lower():
return i
else:
return np.nan
df1['Res'] = df1['Descr'].apply(matcher)
但是我不知道如何回圈遍歷N_Product只對應M_Product的值。
期望的結果:
df1 = {'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical","VALVE, OVERBOARD, BUTTERFLY"],
'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU","VALVE"],
},
'Result': ["VALVE: PRESSURE;", "PUMP", "VALVE: ELECTRICAL;", "GEEKU: ELECTRICAL;","VALVE;"],
}
我將不勝感激任何幫助)
uj5u.com熱心網友回復:
(更新)
根據更新的問題,我對所問問題的理解是:
- 創建一個新
Result列 - 如果
N_Product給定行的 df1 和 df2 中的列匹配,則將df1中給定行的列中找到的字串的 df2N_Product列中的第一個匹配項附加到 df1 中的列的值(帶有中間字符)。M_ProductDescr: - 否則,將
N_Productdf1 放入Result列中。 - 還將一個字符附加
;到放入的內容中Result。
這是一種方法:
def foo(x):
descr = x['Descr'].upper()
match = None
for mStr in df2['M_Product'].str.upper():
if mStr in descr:
match = mStr
break
if match is None:
return x['N_Product'] ';'
else:
return x['N_Product'] ': ' match ';'
mask = df1['N_Product'] == df2['N_Product']
df1.loc[mask, 'Result'] = df1.apply(foo, axis = 1)
df1.loc[~mask, 'Result'] = df1['N_Product'] ';'
解釋:
mask為 df1 的行創建一個布爾系列,它與N_Productdf2 中的相應值匹配。- 對于 df1 中
mask為 True 的行,使用applyto callfoowhich 執行識別M_Product在給定行的列中找到的 df2 的列中的第一個值(如果有)的邏輯,如果找到,則將Descr其包裝在表單的字串中N_Product: M_Product;,否則只是N_Product;。 - 對于 df1 中
mask為 False 的行(即:~mask),將Result列設定為N_Product;。
輸入:
df1:
Descr N_Product
0 VALVE, PRESSURE VALVE
1 pump ttf PUMP
2 Valve, electrical VALVE
3 Geeku, electrical GEEKU
4 VALVE, OVERBOARD, BUTTERFLY VALVE
df2:
N_Product M_Product
0 VALVE PRESSURE
1 VALVE ELECTRICAL
2 VALVE
3 PUMP
4 GEEKU MBA
輸出:
Descr N_Product Result
0 VALVE, PRESSURE VALVE VALVE: PRESSURE;
1 pump ttf PUMP PUMP;
2 Valve, electrical VALVE VALVE: ELECTRICAL;
3 Geeku, electrical GEEKU GEEKU;
4 VALVE, OVERBOARD, BUTTERFLY VALVE VALVE;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477033.html
標籤:Python python-3.x 熊猫 数据框
下一篇:在面向物件編程中列印字串
