【问题标题】:Pandas: How to replace values to np.nan based on Condition for multiple columnsPandas:如何根据多列的条件将值替换为 np.nan
【发布时间】:2020-08-11 17:32:20
【问题描述】:

这是我的数据框。

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 中的值,替换 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 sentence。

df['D'] = np.where(df.A == 0, np.nan, df.D)

【问题讨论】:

  • for x, y in zip(list1, list2): df[y] = df[y].where(df[x] != 0) ?

标签: python arrays pandas replace


【解决方案1】:

首先,我们使用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

【讨论】:

    【解决方案2】:

    让我们做吧

    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)
    

    【讨论】:

      【解决方案3】:

      使用DataFrame.maskDataFrame.rename 作为:

      df[list2] = df[list2].mask(df[list1].rename(columns=dict(zip(list1, list2))).eq(0))
      
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2019-02-12
        • 2018-09-26
        • 2015-10-09
        • 1970-01-01
        相关资源
        最近更新 更多