Pandas数据帧设置单元格为NaN

时间:2018-03-06 04:12:36

标签: pandas dataframe filter nan

我创建了一个这样的数据框:

    A  B
0  aa  1
1  bb  2
2  cc  3
3  dd  1
4  ee  1

然后我用这一行插入标签:

df['label']= np.where((df['B']>2),'start',np.NaN)

结果是

    A  B  label
0  aa  1    nan
1  bb  2    nan
2  cc  3  start
3  dd  1    nan
4  ee  1    nan

这是相当直接的。然而,当我试图反击我的桌子时,我无法得到“我的桌子”。行。

df[(df.label.isnull())]
Empty DataFrame
Columns: [A, B, label]
Index: []

df[(df.label.isna())]
Empty DataFrame
Columns: [A, B, label]
Index: []

df[(df.label == np.nan)]
Empty DataFrame
Columns: [A, B, label]
Index: []

我只使用这个获得nan行:

df[(df.label == 'nan')]
    A  B label
0  aa  1   nan
1  bb  2   nan
3  dd  1   nan
4  ee  1   nan

我错误地将空值设为字符串值' nan'?谢谢。

2 个答案:

答案 0 :(得分:1)

是。 np.where已将np.NaN转换为字符串,因为 start 是一个字符串:

np.where((df['B']>2), 'start', np.NaN)

#array(['nan', 'nan', 'start', 'nan', 'nan'],
#      dtype='|S32')

提供None作为字符串的空值:

df['label'] = np.where((df['B']>2), 'start', None)

df[df.label.isnull()]

#    A  B   label
#0  aa  1   None
#1  bb  2   None
#3  dd  1   None
#4  ee  1   None

或使用pd.Series.where方法:

df['label'] = 'start'
df['label'] = df.label.where(df.B > 2)
df[df.label.isnull()]

#   A   B   label
#0  aa  1   NaN
#1  bb  2   NaN
#3  dd  1   NaN
#4  ee  1   NaN

答案 1 :(得分:0)

您可以使用apply:

df['label'] = df.apply(lambda x: 'start' if x.B>2 else np.nan, axis=1)

df[(df.label.isnull())]
Out[135]: 
    A  B label
0  aa  1   NaN
1  bb  2   NaN
3  dd  1   NaN
4  ee  1   NaN

或者:

df['label'] = df.B.gt(2).apply({True:'start',False:np.nan}.get)