【问题标题】:Data frame (Pandas) filling Missing Values数据框(熊猫)填充缺失值
【发布时间】:2019-09-19 01:40:13
【问题描述】:

我们被要求根据以下假设在数据框的列中填充缺失值(比如说 df['A']): 1- 如果同一行的 df['B'] 的值大于 1000,则使用 0。 2- 否则,使用 df['A']

的平均值

我使用了以下代码,效果很好。

mean_value = df['A'].mean()
df['A'].loc[(df['A'].isna()) & (df['B] > 1000)] = 0
df['A'].fillna(mean_value, inplace = True)

但是你可以看到有两行代码用于填充空值。有什么方法可以只用一行替换它吗?

【问题讨论】:

  • 您的意思是df.loc[(df['A'].isna()) & (df['B] > 1000), 'A'] = 2000?为什么要在 1 行中完成?
  • 对我来说似乎是一个非常好的方法?
  • 我很想知道是否有简单的方法。

标签: python pandas missing-data


【解决方案1】:

您可以查看np.select

con1=(df['A'].isna()) & (df['B'] > 1000)
con2=df['A'].isna()
df['A']=np.select([con1,con2],[0,df['A'].mean()],default=df.A)

【讨论】:

    【解决方案2】:

    也许你可以用这个

    check1 = df['A'].isna()
    check2 = (df['A'].isna()) & (df['B'] > 1000)
    df['A'] = np.where(check1 , np.where(check2,2000,df['A'].mean()), df['A'])
    

    示例输入

          A     B
    0   5.0     500
    1   NaN     2000
    2   3.0     1500
    3   4.0     1100
    4   NaN     7
    

    示例输出

          A     B
    0   5.0     500
    1   2000.0  2000
    2   3.0     1500
    3   4.0     1100
    4   4.0     7
    

    【讨论】:

    • 需要为A.isna() 添加测试,否则所有值都会被更改。我认为从 OP 的定义来看,第 2 行和第 3 行是错误的。
    • @AChampion 感谢您注意到它,我错过了仅替换 NaN 的部分。代码已更新。
    【解决方案3】:

    您可以尝试这种算术方法,尽管在这种情况下单行只会使其难以阅读。由于您将问题从2000 编辑为0,因此无需添加。所以,答案是

    df['A'] = df.A.fillna((df['B'] <= 1000) * df.A.mean())
    

    【讨论】:

      【解决方案4】:

      我使用了下面这行代码,它确实有效,但我仍然相信应该有更温和的方法来解决这个问题。

      df['A'] = df.apply(lambda x: x['A'] if not(np.isnan(x['A'])) else (0 if x['B'] > 1000 else mean_value), axis = 1)
      
      

      有什么想法吗?

      【讨论】:

        猜你喜欢
        • 2020-06-06
        • 1970-01-01
        • 2016-04-30
        • 1970-01-01
        • 2017-08-21
        • 2019-08-01
        • 2021-12-10
        相关资源
        最近更新 更多