我有一个像这样的 pandas 数据框:
dx1 dx2 dx3 dx4 dxpoa1 dxpoa2 dxpoa3 dxpoa4
25041 40391 Y E
25041 40391 25081 N W U
25041 40391 42822 99681 1 N Y Y
有两组列:dx 和 dxpoa。根据 dxpoa 中的某些值,我必须保留 dx 中的值或丢弃它。对于 dx 中的每个值,该行中相应的 dxpoa 中都有一个值。例如:如果 dxpoa = ['Y'或 'W' 或 '1' 或 'E'] 则将 dx 值保留在相应行中,否则丢弃它或用 0 填充它。像 dxpoa1 一样,第一行中是 'Y'因此 dx1 将保持原样。但第二行的 dxpoa1 为“N”,因此第二行的 dx1 对应的值将变为 0。
最佳答案
给定一个像这样构建的数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({'dx1':[25041,25041,25041],
'dx2':[40391,40391,40391],
'dx3':[np.nan,25081,42822],
'dx4':[np.nan,np.nan,99681],
'dxpoa1':['Y','N','1'],
'dxpoa2':['E','W','N'],
'dxpoa3':[np.nan,'U','Y'],
'dxpoa4':[np.nan,np.nan,'Y']})
这给出:
dx1 dx2 dx3 dx4 dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 25041 40391 NaN NaN Y E NaN NaN
1 25041 40391 25081 NaN N W U NaN
2 25041 40391 42822 99681 1 N Y Y
定义一个实现替换规则的函数。当引用列中的值不是“Y”、“W”、“1”或“E”时,这会将目标列替换为零,正如我从您的描述中了解到的:
def subfunc(row,col_reference=None,col_target=None):
if not row[col_reference] in ['Y','W','1','E']:
row[col_target] = 0
return row
然后对每行应用 subfunc 来迭代列名称:
for colname in df.columns:
if 'dxpoa' in colname:
colid = colname.split('dxpoa')[1]
df = df.apply(subfunc,axis=1,col_reference=colname,col_target='dx'+colid)
数据框中的结果
dx1 dx2 dx3 dx4 dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 25041 40391 0 0 Y E NaN NaN
1 0 40391 0 0 N W U NaN
2 25041 0 42822 99681 1 N Y Y
关于python - 在特定条件下替换其他列中数据框中的项目值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33175806/