多DataFrame列值条件筛选及结果合并实现方法咨询
批量处理DataFrame列表生成value列
需求说明
对包含多个DataFrame的列表,按以下规则生成value列:
- 若
pgp值属于指定类别列表grp_list,且pgp与egp相等,value赋值为1 - 若
pgp值不属于grp_list,value赋值为2 - 其余情况(
pgp在列表中但与egp不等),value赋值为0
问题代码分析
原代码存在两处关键问题:
- 变量名不一致:定义的是
grp_list,但判断时误用group_list、group,会触发NameError - 直接对整个DataFrame用条件判断报错:
i['pgp'].isin(...)返回布尔Series,无法直接作为if的判断条件,需用矢量化操作处理每一行
正确实现代码
import pandas as pd import numpy as np # 示例DataFrame df1 = pd.DataFrame({ 'pgp': ['con', 'eco', 'dip', 'pol', 'god', 'ent'], 'egp': ['con', 'eco', 'health', 'health', 'con', 'eco'] }) df2 = pd.DataFrame({ 'pgp': ['con', 'edu', 'pol', 'art'], 'egp': ['con', 'edu', 'pol', 'art'] }) df_list = [df1, df2] # 多个DataFrame组成的列表 grp_list = ['con', 'eco', 'dip', 'pol'] # 指定类别列表 # 批量处理每个DataFrame for df in df_list: # 定义条件列表和对应赋值 conditions = [ (df['pgp'].isin(grp_list)) & (df['pgp'] == df['egp']), ~df['pgp'].isin(grp_list) ] values = [1, 2] # 未匹配条件的情况默认赋值0 df['value'] = np.select(conditions, values, default=0) # 查看处理后的df1结果 print(df1)
处理后示例结果(df1)
| pgp | egp | value |
|---|---|---|
| con | con | 1 |
| eco | eco | 1 |
| dip | health | 0 |
| pol | health | 0 |
| god | con | 2 |
| ent | eco | 2 |
代码说明
- 用
numpy.select实现多条件矢量化赋值,比逐行循环效率更高 - 按优先级定义条件:先匹配"pgp在列表且与egp相等"的情况,再匹配"pgp不在列表"的情况,剩余场景自动赋值0
- 遍历DataFrame列表,批量为每个DataFrame添加
value列
内容的提问来源于stack exchange,提问作者user19840753
相关产品推荐
相关产品推荐

