Python 在其他列中的特定条件下替换数据框中的项值
我有一个像这样的熊猫数据框:Python 在其他列中的特定条件下替换数据框中的项值,python,pandas,Python,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 有两组列:d
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
以下是一种矢量化的方式(使用@vmg的便捷起始框架):
这样做的目的是为最后N//2列创建一个True和False数组,其中值在列表中时为True,不在列表中时为False(请注意,我假设1是字符串
“1”
,而不是整数1
):
然后我们可以使用
where
设置前N//2列的值,将keep
中的值保持为True,否则将其替换为0。您是否已经尝试过任何操作?你们有什么问题吗?@AnandSKumar:我可以更改行中某列的值,但不知道如何迭代行或列。我正在尝试使用iterrow()函数。但由于对python知之甚少,这是一个障碍。
>>> N = len(df.columns)
>>> keep = df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]).values
>>> df.iloc[:,:N//2] = df.iloc[:,:N//2].where(keep, 0)
>>> df
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
>>> df.iloc[:,-N//2:]
dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 Y E NaN NaN
1 N W U NaN
2 1 N Y Y
>>> df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"])
dxpoa1 dxpoa2 dxpoa3 dxpoa4
0 True True False False
1 False True False False
2 True False True True
>>> df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]).values
array([[ True, True, False, False],
[False, True, False, False],
[ True, False, True, True]], dtype=bool)