Pandas:替换缺失的DataFrame值/条件计算:fillna

3

我想计算一个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']

导致的结果是:

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

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

df['calc'].where(df['b'].isnull()) = df['c']-df['a']

这会导致SyntaxError: cannot assign to function call

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

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)

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

0.0
-1.0
-1.0
-3.0

但是df['calc']中的值没有被写入,数据框保持不变:

print(df['calc'])
0    0.0
1   -1.0
2    NaN
3   -3.0

如何正确地覆盖NaN值?

3个回答

6

最后,我偶然发现了 .fillna

df['calc'] = df['calc'].fillna( df['c']-df['a'] )

完成工作!有人能解释一下上述两种方法的问题吗?


2

方法二:

你将值分配给i,但这不会修改你的原始数据框。

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)
    df.loc[index,'calc'] = i #<------------- here

同时不要使用iterrows(),它太慢了。

方法1: 使用Pandas的where()方法检查数据框中的一个或多个条件,并根据条件返回结果。默认情况下,不满足条件的行将填充NaN值。

应该这样写:

df['calc'] = df['calc'].where(df['b'].isnull(), df['c']-df['a'])

但这只会找到那些具有非零值的行值,并将其填充为给定的值。

用法:

df['calc'] = df['calc'].where(~df['b'].isnull(), df['c']-df['a'])

或者

df['calc'] = np.where(df['b'].isnull(), df['c']-df['a'], df['calc'])

2

不要先从a中减去b,再从a中减去c。相反,您可以首先使用列c中的值填充列b中的nan值,然后再减去列a

df['calc'] = df['b'].fillna(df['c']) - df['a']

   a    b  c  calc
0  1  1.0  2   0.0
1  2  1.0  2  -1.0
2  3  NaN  2  -1.0
3  4  1.0  2  -3.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接