Pandas数据帧设置单元格为NaN

问题描述 投票:1回答:2

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

    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

这是相当直接的。然而,当我试图反击我的桌子时,我无法获得'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',我做错了吗?谢谢。

pandas dataframe filter nan
2个回答
1
投票

是。 np.wherenp.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

0
投票

您可以使用申请:

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)
© www.soinside.com 2019 - 2024. All rights reserved.