为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守候你守候我 2022-10-25 15:13:06
这是我的数据框。I  A  B  C  D  E  F1  9  4  0  T  F  F2  0  5  1  S  X  J3  1  8  0  G  G  J这是我的预期输出。我想替换 A ==0 中的值,替换 D 中的 np.nan。I  A   B   C   D   E   F1  9   4   0   T   F   nan2  0   5   1   nan X   J3  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])对于下面的代码,运行良好。但是有很多列,所以我想使用列表和句子。df['D'] = np.where(df.A == 0, np.nan, df.D)
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

首先,我们使用您的两个列表创建一个字典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


查看完整回答
反对 回复 2022-10-25
?
噜噜哒

TA贡献1784条经验 获得超7个赞

让我们做


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)


查看完整回答
反对 回复 2022-10-25
?
HUH函数

TA贡献1836条经验 获得超4个赞

DataFrame.mask用作DataFrame.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


查看完整回答
反对 回复 2022-10-25
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信