我有一个像这样的熊猫数据框:

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。

最佳答案

这是一种矢量化的查看方式(使用@vmg方便的起始框架):

>>> 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




这是为最后N // 2列创建一个True和False数组,其中True表示列表中的值,而False则不在列表中(请注意,我假设1是字符串"1",不是整数1):

>>> 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)


然后,我们可以使用where设置前N // 2列的值,并保持keep为True的值,否则将其替换为0。

10-06 01:43