Python 错误:浮点对象没有属性notnull
我有一个数据帧:Python 错误:浮点对象没有属性notnull,python,pandas,Python,Pandas,我有一个数据帧: a b c 0 nan Y nan 1 23 N 3 2 nan N 2 3 44 Y nan 我希望得到以下结果: a b c d 0 nan Y nan nan 1 23 N 3 96 2 nan N 2 nan 3 44 Y nan 44 我希望有一个条件当a列为null时,d将为nu
a b c
0 nan Y nan
1 23 N 3
2 nan N 2
3 44 Y nan
我希望得到以下结果:
a b c d
0 nan Y nan nan
1 23 N 3 96
2 nan N 2 nan
3 44 Y nan 44
我希望有一个条件当a列为null时,d将为null,否则如果b列为N,c列不为null,则d列等于a列*c列否则d列等于a列
我已经完成了此代码,但我得到了错误:
def f4(row):
if row['a']==np.nan:
return np.nan
elif row['b']=="N" & row(row['c'].notnull()):
return row['a']*row['c']
else:
return row['a']
DF['P1']=DF.apply(f4,axis=1)
谁能帮我指出我的错误在哪里?我已经参考了这个并尝试了这个,但也得到了错误您不需要
应用
,使用np。其中
:
df['d'] = np.where(df.a.isnull(),
np.nan,
np.where((df.b == "N")&(~df.c.isnull()),
df.a*df.c,
df.a))
输出:
a b c d
0 NaN Y NaN NaN
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
你可以试试
df['d'] = np.where((df.b == 'N') & (pd.notnull(df.c)), df.a*df.c, np.where(pd.notnull(df.a), df.a, np.nan))
a b c d
0 NaN Y NaN NaN
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
在您当前的代码中,只需将series.notnull更改为pd.notnull(series)即可。虽然np.where应该更有效
def f4(row):
if row['a']==np.nan:
return np.nan
elif (row['b']=="N") & (pd.notnull(row.c)):
return row['a']*row['c']
else:
return row['a']
df['d']=df.apply(f4,axis=1)
由于您只希望传播
Nan
s,因此将列相乘即可:
>>> df = pd.read_clipboard()
>>> df
a b c
0 NaN Y NaN
1 23.0 N 3.0
2 NaN N 2.0
3 44.0 Y NaN
>>> df.a * df.c
0 NaN
1 69.0
2 NaN
3 NaN
dtype: float64
>>>
如果要在某个条件下执行此操作,可以在此处使用np.where
,而不是。apply
。您只需要以下内容:
>>> df
a b c
0 NaN Y NaN
1 23.0 N 3.0
2 NaN N 2.0
3 44.0 Y NaN
>>> np.where(df.b == 'N', df.a*df.c, df.a)
array([ nan, 69., nan, 44.])
这是大多数涉及Nan
的操作的默认行为。因此,您可以简单地分配上述结果:
>>> df['d'] = np.where(df.b == 'N', df.a*df.c, df.a)
>>> df
a b c d
0 NaN Y NaN NaN
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
>>>
我只想详细说明一下:
np.where(df.b == 'N', df.a*df.c, df.a)
你可以把它想象成“where df.b=='N',给我df.a*df.c的结果,否则,给我df.a:
>>> np.where(df.b == 'N', df.a*df.c, df.a)
array([ nan, 69., nan, 44.])
还要注意,如果您的数据帧有点不同:
>>> df
a b c
0 NaN Y NaN
1 23.0 Y 3.0
2 NaN N 2.0
3 44.0 Y NaN
>>> df.loc[0,'a'] = 99
>>> df.loc[0, 'b']= 'N'
>>> df
a b c
0 99.0 N NaN
1 23.0 N 3.0
2 NaN N 2.0
3 44.0 Y NaN
那么,以下情况就不等同了:
>>> np.where(df.b == 'N', df.a*df.c, df.a)
array([ nan, 69., nan, 44.])
>>> np.where((df.b == 'N') & (~df.c.isnull()), df.a*df.c, df.a)
array([ 99., 69., nan, 44.])
因此,您可能希望使用稍微详细一点的:
>>> df['d'] = np.where((df.b == 'N') & (~df.c.isnull()), df.a*df.c, df.a)
>>> df
a b c d
0 99.0 N NaN 99.0
1 23.0 N 3.0 69.0
2 NaN N 2.0 NaN
3 44.0 Y NaN 44.0
>>>
使用
row['c']
给了您一个值。所以有什么方法可以克服这个问题,因为我的c行应该包含nan(空值)这非常简单:)+1虽然这个代码片段可以解决这个问题,但确实有助于提高您文章的质量。请记住,您是在为将来的读者回答这个问题,而那些人可能不知道您的代码建议的原因。请也尽量不要用解释性注释挤满您的代码,这会降低您的阅读效率代码和解释的可读性!谢谢,这太短了,这里有一个附加组件:对于Series和DataFrame,返回与布尔数组相同的类型,包含布尔值。因此pd.notnull(df)和pd.notna(df)结果相同。很好的解决方案,当我想在for循环的迭代中跳过带有NaN的行时,效果很好:对于I,df.iterrows()中的行
,如果pd.notnull(df['Column'][I]):
pd.isnull(df['Description'][i])