【问题标题】:Pandas: Replace missing dataframe values / conditional calculation: fillna熊猫:替换缺失的数据框值/条件计算:fillna
【发布时间】:2021-01-20 23:02:27
【问题描述】:

我想计算一个 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 值的正确方法是什么?

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    最后,我偶然发现了.fillna

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

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

    【讨论】:

      【解决方案2】:

      方法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()太慢了。

      方法一: Pandas where() method is used to check a data frame for one or more condition and return the result accordingly. By default, The rows not satisfying the condition are filled with NaN value.

      应该是:

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

      【讨论】:

        【解决方案3】:

        不要从a 中减去b,然后从a 中减去c 您可以做的是首先将fill b 列中的nan 值与@987654328 列中的值@,然后减去列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
        

        【讨论】:

          猜你喜欢
          • 2018-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-31
          • 2021-05-27
          • 1970-01-01
          • 2022-08-11
          • 1970-01-01
          相关资源
          最近更新 更多