![](/img/trans.png)
[英]Pandas Iterate through rows, compare column value with string in a list, return a value from another column
[英]Compare string in a column of pandas with string from another pandas column
我有以下熊貓
df:
colA
abc dbe fec
ghi jkl ref
sgsh hjo
df2:
colB colC
hjo 12
hhh chk 14
eee abc 17
我想比較df中每列的字符串中的單詞與df2中colB中字符串中的每個單詞。 如果找到匹配,我想將相應的colC添加到df1。 如果任何單詞與colB匹配,它應該停止並移動到下一列。
結果:
newdf:
colA colC
abc dbe fec 17
ghi jkl ref none
sgsh hjo 12
最快的方法是什么(龐大的數據集)
如解決方案中所述,
pat:
'(Absolute Plumbing|D\xc3\xa9jeuner Eggcetera|Ivy Garcia, LMT|Native Bloom Landscape and Design|Seay\'s|Thulasi Kitchen|Liyuen|Viva Photo Booth|Cleopatra Internet Cafe|R&B\'s Pizza Place|Hilton Toronto/Markham Suites Conference Centre & Spa|Hegel Yoga|Boonda\'s|San Tan Aikido Kokikai|Mega Motors|Blue Sky Nails & Spa|Restaurant Cinq Epices|North East Auto Credit|Blind Tiger|T & S Towing'
用這個:
制作參考數據庫的字典:
d = dict(zip(df2.colB,df2.colC))
#{'hjo': 12, 'hhh chk': 14, 'abc': 17}
創建一個模式:
pat = r'({})'.format('|'.join(d.keys()))
#'(hjo|hhh chk|abc)'
df['colC']=df.colA.str.extract(pat, expand=False).dropna().map(d)
print(df)
colA colC
0 abc dbe fec 17.0
1 ghi jkl ref NaN
2 sgsh hjo 12.0
編輯每行中的轉義字符和空格匹配* (不確定是否最佳方式,但有效)*
考慮到df2
是:
colB colC
0 hjo 12
1 hhh ref 14
2 abc 17
和df1與你的例子相同:
colA
0 abc dbe fec
1 ghi jkl ref
2 sgsh hjo
import re
df_split=pd.DataFrame(df2.colB.str.split(' ').tolist(),index=df2.colC).stack().reset_index(0).rename(columns={0:'colB'}).reindex(df2.columns,axis=1)
print(df_split)
colB colC
0 hjo 12
0 hhh 14
1 ref 14
0 abc 17
您會注意到具有空格的列將轉換為具有相同值的行
d = dict(zip(df_split.colB,df_split.colC))
#{'hjo': 12, 'hhh': 14, 'ref': 14, 'abc': 17}
keys=[re.sub('[^A-Za-z0-9]+', '', i) for i in d.keys()]
pat = r'({})'.format('|'.join(keys))
df['colC']=df.colA.str.extract((pat),expand=False).map(d)
print(df)
colA colC
0 abc dbe fec 17
1 ghi jkl ref 14
2 sgsh hjo 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.