错误:float对象没有属性notnull

11 python pandas

我有一个数据帧:

  a     b     c
0 nan   Y     nan
1  23   N      3
2 nan   N      2
3  44   Y     nan
Run Code Online (Sandbox Code Playgroud)

我希望得到这样的结果:

  a     b     c      d
0 nan   Y     nan   nan
1  23   N      3     96
2 nan   N      2    nan
3  44   Y     nan    44
Run Code Online (Sandbox Code Playgroud)

我希望有一个条件,当列a为空时,如果列b为N且列c不为null则d为空,则列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)
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我指出我的错误在哪里?我已经参考了这个并尝试了这个,但也得到错误基于if-elif-else条件创建一个新列

Max*_*ner 12

pd.isnull(df['Description'][i])
Run Code Online (Sandbox Code Playgroud)

或者

pd.isna(df['Description'][i])
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可以解决问题,但[包括解释](//s.tk/meta/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您建议代码的原因。还请尽量不要在代码中添加解释性注释,这会降低代码和解释的可读性! (3认同)

Sco*_*ton 9

你不需要apply,使用np.where:

df['d'] = np.where(df.a.isnull(),
         np.nan,
         np.where((df.b == "N")&(~df.c.isnull()),
                  df.a*df.c,
                  df.a))
Run Code Online (Sandbox Code Playgroud)

输出:

      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
Run Code Online (Sandbox Code Playgroud)


jua*_*aga 7

由于您只想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
>>>
Run Code Online (Sandbox Code Playgroud)

如果你想在某种条件下这样做,你可以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.])
Run Code Online (Sandbox Code Playgroud)

这是涉及的大多数操作的默认行为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
>>>
Run Code Online (Sandbox Code Playgroud)

只是详细说明这个:

np.where(df.b == 'N', df.a*df.c, df.a)
Run Code Online (Sandbox Code Playgroud)

正在做,你可以把它想象成"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.])
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您的数据框架略有不同:

>>> 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
Run Code Online (Sandbox Code Playgroud)

那么以下就不等同了:

>>> 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.])
Run Code Online (Sandbox Code Playgroud)

所以你可能想要使用稍微冗长的:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)


Vai*_*ali 5

你可以试试

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
Run Code Online (Sandbox Code Playgroud)

请参阅有关pandas notnull 的文档,在当前代码中,只需将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)
Run Code Online (Sandbox Code Playgroud)