如何在Pandas中匹配列表内所有元素的对应信息?
如何匹配DataFrame中多值分隔字段的对应信息?
这确实是处理多值分隔字段时很常见的需求,我来分享两种实用的解决方法,都能完美实现你想要的效果:
方法一:拆分-匹配-合并(适合大数据量)
这种方法通过将多值字段拆分成单行,匹配完成后再合并,效率更高,适合处理较大的数据集:
首先准备你的原始数据:
import pandas as pd df = pd.DataFrame({'ID':['1','2'],'Fruit':['apple|banana','banana|watermelon']}) price = pd.DataFrame({'Fruit':['apple','banana','watermelon','pear'], 'price':['1.49','0.59','5.99','1.99']})
步骤1:拆分多值字段并展开
把df中的Fruit列按|拆分,然后将每个水果单独成一行,同时保留对应的ID:
df_expanded = df.assign(Fruit=df['Fruit'].str.split('|')).explode('Fruit')
执行后得到的df_expanded是这样的:
ID Fruit 0 1 apple 0 1 banana 1 2 banana 1 2 watermelon
步骤2:匹配价格
将展开后的表和price表做左连接,匹配每个水果对应的价格:
merged = pd.merge(df_expanded, price, on='Fruit', how='left')
步骤3:重新合并字段
按ID分组,把每个ID对应的水果和价格重新用|拼接起来:
result = merged.groupby('ID').agg( Fruit=('Fruit', '|'.join), price=('price', '|'.join) ).reset_index()
最终得到的result就是你想要的结果:
ID Fruit price 0 1 apple|banana 1.49|0.59 1 2 banana|watermelon 0.59|5.99
方法二:字典映射+逐行处理(代码更简洁)
如果你的数据集不大,这种方法代码更简洁,直接用字典映射匹配价格:
步骤1:将价格表转为字典
把price表转换成以水果名为键、价格为值的字典,方便快速查找:
price_dict = price.set_index('Fruit')['price'].to_dict()
步骤2:逐行匹配并拼接价格
用apply函数处理df的每一行,拆分水果字段后逐个匹配价格,再拼接成字符串:
df['price'] = df['Fruit'].apply( lambda x: '|'.join([price_dict[fruit] for fruit in x.split('|')]) )
执行后df就直接更新为你期望的结果啦。
两种方法各有优劣:方法一效率更高,适合大数据量;方法二代码更短,适合小数据集,你可以根据自己的实际情况选择~
内容的提问来源于stack exchange,提问作者Lily
相关产品推荐
相关产品推荐

