如果在任何其他列中有相应的NaN,我怎样才能非迭代地将NaN放在DataFrame列中?

时间:2014-02-05 20:08:43

标签: python pandas

给出一个3列数据框,df

    a    b      c
0 NaN    a   True
1   1    b   True
2   2    c  False
3   3  NaN  False
4   4    e   True

[5 rows x 3 columns]

我想在NaN列的c中为NaN存在于任何其他colunn中的每一行添加for col in df: df['c'][pd.np.isnan(df[col])] = pd.np.nan 。我目前的做法如下:

{{1}}

我强烈怀疑有一种方法可以通过逻辑索引来实现,而不是按照我目前的方式迭代列。

怎么可以这样做?

谢谢!

3 个答案:

答案 0 :(得分:5)

如果你不关心bool / float问题,我建议:

>>> df.loc[df.isnull().any(axis=1), "c"] = np.nan
>>> df
    a    b   c
0 NaN    a NaN
1   1    b   1
2   2    c   0
3   3  NaN NaN
4   4    e   1

[5 rows x 3 columns]

如果你真的这样做,那么从你的df框架再次开始,你可以:

>>> df["c"] = df["c"].astype(object)
>>> df.loc[df.isnull().any(axis=1), "c"] = np.nan
>>> df
    a    b      c
0 NaN    a    NaN
1   1    b   True
2   2    c  False
3   3  NaN    NaN
4   4    e   True

[5 rows x 3 columns]

答案 1 :(得分:3)

df.c[df.ix[:, :'c'].apply(lambda r: any(r.isnull()), axis=1)] = np.nan

请注意,您可能需要将列c的类型更改为float,否则您将无法将nan分配给整数列。

答案 2 :(得分:2)

过滤并选择“{”为“a”或“b”的行NaN,并将“c”分配给NaN

In [18]:

df.ix[pd.isnull(df.a) | pd.isnull(df.b),'c'] = NaN

In [19]:

df

Out[19]:

    a    b   c
0 NaN    a NaN
1   1    b   1
2   2    c   0
3   3    d   0
4   4  NaN NaN

[5 rows x 3 columns]