Python 熊猫:如何根据多列的条件将值替换为np.nan

Python 熊猫:如何根据多列的条件将值替换为np.nan,python,arrays,pandas,replace,Python,Arrays,Pandas,Replace,这是我的数据框 I A B C D E F 1 9 4 0 T F F 2 0 5 1 S X J 3 1 8 0 G G J 这是我的预期输出。 我想替换A==0中的if值,并将其替换为D中的np.nan I A B C D E F 1 9 4 0 T F nan 2 0 5 1 nan X J 3 1 8 0 G G nan 我想用A/B/C列的值替换D/E

这是我的数据框

I  A  B  C  D  E  F
1  9  4  0  T  F  F
2  0  5  1  S  X  J
3  1  8  0  G  G  J
这是我的预期输出。 我想替换A==0中的if值,并将其替换为D中的np.nan

I  A   B   C   D   E   F
1  9   4   0   T   F   nan
2  0   5   1   nan X   J
3  1   8   0   G   G   nan
我想用A/B/C列的值替换D/E/F列上的值。 例如,D列根据A列的大小而变化。(A->D,B->E,C->F)

我尝试了这个代码,但没有改变值

list1 = ['A', 'B', 'C']
list2 = ['D', 'E', 'F']

for i in list2:
    for j in list1:
        df[i] = np.where(df[j] == 0, np.nan, df[i])
对于下面的代码,运行良好。 但是有很多列,所以我想用list和for句子

df['D'] = np.where(df.A == 0, np.nan, df.D)
与as一起使用:


首先,我们使用
zip

replace_dict = dict(zip(list1,list2))
然后我们循环它来处理你的任务

for k,v in replace_dict.items():
    df.loc[df[k] == 0, v] = np.nan

print(df)
   I  A  B  C    D  E    F
0  1  9  4  0    T  F  NaN
1  2  0  5  1  NaN  X    J
2  3  1  8  0    G  G  NaN
另一种方法是在列表中使用
np.where

df[list2] = np.where(df[list1].eq(0), np.nan,df[list2])

print(df)

   I  A  B  C    D  E    F
0  1  9  4  0    T  F  NaN
1  2  0  5  1  NaN  X    J
2  3  1  8  0    G  G  NaN
让我们做吧

df.loc[:,'D':].mask(df.loc[:,'A':'C'].eq(0).values)
     D  E    F
0    T  F  NaN
1  NaN  X    J
2    G  G  NaN
df.loc[:,'D':]= df.loc[:,'D':].mask(df.loc[:,'A':'C'].eq(0).values)
对于zip中的x,y(列表1,列表2):df[y]=df[y]。其中(df[x]!=0)
df.loc[:,'D':].mask(df.loc[:,'A':'C'].eq(0).values)
     D  E    F
0    T  F  NaN
1  NaN  X    J
2    G  G  NaN
df.loc[:,'D':]= df.loc[:,'D':].mask(df.loc[:,'A':'C'].eq(0).values)