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])