Pandas:替换丢失的数据帧值/条件计算:fillna

Jon*_*nas 3 python nan dataframe pandas

我想计算 pandas 数据框,但某些行包含缺失值。对于那些缺失的值,我想使用不同的算法。可以说:

  • 如果 B 列包含值,则从 B 中减去 A
  • 如果 B 列不包含值,则从 C 中减去 A
import pandas as pd
df = pd.DataFrame({'a':[1,2,3,4], 'b':[1,1,None,1],'c':[2,2,2,2]})
df['calc'] = df['b']-df['a']
Run Code Online (Sandbox Code Playgroud)

结果是:

print(df)
   a    b  c  calc
0  1  1.0  2   0.0
1  2  1.0  2  -1.0
2  3  NaN  2   NaN
3  4  1.0  2  -3.0
Run Code Online (Sandbox Code Playgroud)

方法 1:使用以下方法填充 NaN 行.where

df['calc'].where(df['b'].isnull()) = df['c']-df['a']
Run Code Online (Sandbox Code Playgroud)

这会导致SyntaxError:无法分配给函数调用

方法 2:使用以下方法填充 NaN 行.iterrows()

for index, row in df.iterrows():
    i = df['calc'].iloc[index]

    if pd.isnull(row['b']):
        i = row['c']-row['a']
        print(i)
    else:
        i = row['b']-row['a']
        print(i)
Run Code Online (Sandbox Code Playgroud)

执行时没有错误并且计算正确,这些i值将打印到控制台:

0.0
-1.0
-1.0
-3.0
Run Code Online (Sandbox Code Playgroud)

值没有写入df['calc'],数据帧保持原样:

print(df['calc'])
0    0.0
1   -1.0
2    NaN
3   -3.0
Run Code Online (Sandbox Code Playgroud)

覆盖值的正确方法是什么NaN

Jon*_*nas 6

最后,我偶然发现.fillna

df['calc'] = df['calc'].fillna( df['c']-df['a'] )
Run Code Online (Sandbox Code Playgroud)

完成工作!谁能解释一下上述两种方法有什么问题......?