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

这是我的数据框。


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

对于下面的代码,运行良好。但是有很多列,所以我想使用列表和句子。


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


守候你守候我
浏览 170回答 3
3回答

白衣非少年

首先,我们使用您的两个列表创建一个字典zipreplace_dict = dict(zip(list1,list2))然后我们循环它来处理你的任务,for k,v in replace_dict.items():    df.loc[df[k] == 0, v] = np.nanprint(df)   I  A  B  C    D  E    F0  1  9  4  0    T  F  NaN1  2  0  5  1  NaN  X    J2  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    F0  1  9  4  0    T  F  NaN1  2  0  5  1  NaN  X    J2  3  1  8  0    G  G  NaN

噜噜哒

让我们做df.loc[:,'D':].mask(df.loc[:,'A':'C'].eq(0).values)     D  E    F0    T  F  NaN1  NaN  X    J2    G  G  NaNdf.loc[:,'D':]= df.loc[:,'D':].mask(df.loc[:,'A':'C'].eq(0).values)

HUH函数

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    F0  1  9  4  0    T  F  NaN1  2  0  5  1  NaN  X    J2  3  1  8  0    G  G  NaN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python