Pandas如何通过键匹配行的字典选取df指定值生成拼接语句
字典匹配行标识+动态选列生成格式化字段方案
测试数据构造
先复现示例用到的DataFrame和映射字典:
import pandas as pd # 构造目标DataFrame a=['a','b','c','d'] b=['the','fox','the','then'] c=['quick','jumps','lazy','barks'] d=['brown','over','dog','loudly'] df=pd.DataFrame(zip(a,b,c,d),columns=['indexcol','col1','col2','col3']) # 构造映射字典:键与indexcol列值一一对应,值为当前行需要选取的列名列表 keys=['a','b','c','d'] vals=[] vals.append(['col1','col3']) vals.append(['col1','col2']) vals.append(['col1','col2','col3']) vals.append(['col2','col3']) newdict = {k: v for k, v in zip(keys, vals)}
核心实现
逻辑非常直接:逐行读取indexcol的值,到字典里匹配当前行需要取的列集合,按要求格式拼接列名和对应值,最后用|分隔即可。apply写法可读性最高,后续调整规则也方便:
def concat_format_str(row): # 取出当前行需要拼接的列列表 target_cols = newdict[row['indexcol']] # 逐个生成字段片段 field_segs = [f"{col} is '{row[col]}'" for col in target_cols] # 拼接成最终字符串 return ' | '.join(field_segs) # 为df新增结果列 df['formatted_result'] = df.apply(concat_format_str, axis=1)
运行结果
最终生成的结果列各值如下:
- indexcol='a'行:
col1 is 'the' | col3 is 'brown' - indexcol='b'行:
col1 is 'fox' | col2 is 'jumps' - indexcol='c'行:
col1 is 'the' | col2 is 'lazy' | col3 is 'dog' - indexcol='d'行:
col2 is 'barks' | col3 is 'loudly'
如果处理百万行以上的大数据集,可以改用向量化写法优化性能;常规十万行以内的数据量用上面的apply写法完全够用,维护成本最低。
内容的提问来源于stack exchange,提问作者aasseeedd
相关产品推荐
相关产品推荐

