基于列表元素部分匹配合并两个Pandas DataFrame
问题描述
我有两个Pandas DataFrame:
主数据df1:
import pandas as pd df1 = pd.DataFrame( data= [[['mayor', 'lord'], 25], [['prince', 'sheriff'], 33], [['king george', 'queen'], 32], [['bristol, counsellor'], 43], [['exchequer'], 45]], columns=['V1', 'V2'] ) df1.update(df1[['V1']].applymap('{}'.format)) print(df1)
另一个DataFrame df2:
df2 = pd.DataFrame( data= [['mayor', 55], ['sheriff', 54], ['counsellor', 53], ['exchequer', 50]], columns=['Var1', 'Var2'] ) print(df2)
我的需求是:如果df1的V1列中(列表格式的元素)包含df2的Var1对应的字符串,就把df2的Var2值映射到主数据中新增的V3列,最终目标DataFrame如下:
dfgoal = pd.DataFrame( data= [[['mayor', 'lord'], 25, 55], [['prince', 'sheriff'], 33, 54], [['king george', 'queen'], 32, ], [['bristol, counsellor'], 43, 53], [['exchequer'], 45, 50]], columns=['V1', 'V2', 'V3'] ) dfgoal.update(dfgoal[['V1']].applymap('{}'.format)) print(dfgoal)
我试过一些基于部分字符串匹配的方法,但因为V1是列表对象,匹配可以出现在列表的任意元素中,一直没成功。
解决方案
可以按照以下步骤实现需求:
- 先把df2转换成字典,用Var1作为键、Var2作为值,方便快速查找匹配项:
var_map = df2.set_index('Var1')['Var2'].to_dict()
- 定义处理函数:遍历V1列表中的每个元素,检查是否包含var_map里的键,找到第一个匹配项就返回对应的值,无匹配则返回空:
def get_matched_value(lst): for item in lst: for key in var_map: if key in item: return var_map[key] return None
- 对df1的V1列应用函数,生成新的V3列:
df1['V3'] = df1['V1'].apply(get_matched_value)
完整代码如下:
import pandas as pd # 初始化df1 df1 = pd.DataFrame( data= [[['mayor', 'lord'], 25], [['prince', 'sheriff'], 33], [['king george', 'queen'], 32], [['bristol, counsellor'], 43], [['exchequer'], 45]], columns=['V1', 'V2'] ) df1.update(df1[['V1']].applymap('{}'.format)) # 初始化df2 df2 = pd.DataFrame( data= [['mayor', 55], ['sheriff', 54], ['counsellor', 53], ['exchequer', 50]], columns=['Var1', 'Var2'] ) # 构建映射字典 var_map = df2.set_index('Var1')['Var2'].to_dict() # 定义匹配函数 def get_matched_value(lst): for item in lst: for key in var_map: if key in item: return var_map[key] return None # 生成V3列 df1['V3'] = df1['V1'].apply(get_matched_value) print(df1)
执行后得到的结果与目标dfgoal完全一致。
内容的提问来源于stack exchange,提问作者econbuffin2019
相关产品推荐
相关产品推荐

