如何基于另一DataFrame列名动态修改目标DataFrame列值?
动态根据标识列将目标列设为NULL的实现方案
问题描述
我有如下DataFrame df2:
import pandas as pd df2 = pd.DataFrame({'ID': [1, 2, 3, 4], 'NAME': ['JOHN', 'MARY', 'MATT', 'TIM'], 'EFF_D': ['11-22-2001', '12-19-2002', '04-11-2002', '04-11-2002'], 'EFF_D_NI': ['Y', 'N', 'Y', 'Y'], 'END_D': ['11-22-2001', '12-19-2002', '04-11-2002', '04-11-2002'], 'END_D_NI': ['Y', 'Y', 'Y', 'Y'], 'OPEN_D': ['11-22-2001', '12-19-2002', '04-11-2002', 'None'], 'OPEN_D_NI': ['N', 'N', 'N', 'Y'], 'AMT': [1000, 2000, 3000, 4000], 'AMT_NI': ['Y', 'N', 'Y', 'N'], 'STATUS': ['A', 'X', 'Z', 'A']})
另有DataFrame df1,用来指定需要处理的列对(目标列和对应的标识列):
df1 = pd.DataFrame({'Column': ['EFF_D', 'END_D', 'OPEN_D', 'AMT'], 'Null_IND_COLUMN': ['EFF_D_NI', 'END_D_NI', 'OPEN_D_NI', 'AMT_NI']})
需求是:当标识列(Null_IND_COLUMN对应列)的值为'Y'时,将对应的目标列(Column对应列)设为NULL,且要动态处理df1中所有指定的列对。预期输出如下:
ID NAME EFF_D EFF_D_NI END_D END_D_NI OPEN_D OPEN_D_NI AMT AMT_NI STATUS 1 JOHN NULL Y NULL Y 11-22-2001 N 1000 Y A 2 MARY 12-19-2002 N NULL Y 12-19-2002 N 2000 N X 3 MATT NULL Y NULL Y 04-11-2002 N NULL Y Z 4 TIM NULL Y NULL Y NULL Y 4000 N A
我是Python新手,想了解如何动态实现该需求。
解决方案
可以通过遍历df1中的列对,结合布尔索引来实现动态处理:
代码实现
import pandas as pd # 先把df2里的'None'字符串替换成pandas标准缺失值pd.NA df2['OPEN_D'] = df2['OPEN_D'].replace('None', pd.NA) # 遍历df1的每一行,逐个处理指定的列对 for _, row in df1.iterrows(): target_col = row['Column'] indicator_col = row['Null_IND_COLUMN'] # 定位标识列为'Y'的行,将对应目标列设为缺失值 df2.loc[df2[indicator_col] == 'Y', target_col] = pd.NA # 打印处理后的结果 print(df2.to_string())
代码说明
- 统一缺失值格式:原数据中
OPEN_D列的'None'是字符串,替换为pd.NA后,所有缺失值都用pandas标准格式表示,方便后续操作和查看。 - 动态遍历列对:利用
iterrows()遍历df1的每一行,自动获取需要处理的目标列和标识列,不管df1里有多少列对都能处理。 - 精准赋值:通过
df2.loc[布尔条件, 目标列]的方式,只修改标识列为'Y'的行对应的目标列,不会影响其他行的数据。
运行这段代码后,就能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

