给出一个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}}
我强烈怀疑有一种方法可以通过逻辑索引来实现,而不是按照我目前的方式迭代列。
怎么可以这样做?
谢谢!
答案 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]