【问题标题】:Replace NaN with existing values proportionately按比例将 NaN 替换为现有值
【发布时间】:2018-07-06 15:04:04
【问题描述】:

假设我有一个数据框,其中有一列 Quality,值 [Poor, Average, Good, Excellent]

框架有 120 个值,其中 20 个是 NaN,其余 100 个有 20、30、40、10 个 [Poor, Average, Good, Excellent]

是否有任何简单的方法可以使用来自[Poor, Average, Good, Excellent] 的值替换 20 个 NaN 行,从而使整个框架的比例保持在 20% 差、30% 平均、40% 好和 10% 优,使用 Python ,熊猫和 NumPy?

想法是在填充NaN后保留原始比例,而不管数据集的大小。

【问题讨论】:

  • 您需要它是完全相同的百分比,还是只是统计上的相同?如果后者没问题,您可以使用np.random_choice 生成一个列表,其长度由空值的# 给出,值的分布由您的非空值给出。
  • @ALollz,你能用代码示例说明一下吗?总的来说,我对 Pandas 和 Python 有点陌生。

标签: python pandas numpy dataframe


【解决方案1】:

不确定是否有更简单的方法,我写了这个函数来实现我想要的。

def replace_with_proportion(frame, column):
     isnull = frame[column].isnull()
     sample = frame[column].dropna()
     sample=set(sample)
     countframe=pd.DataFrame(columns=["name", "count", "proportion"])
     for x in sample:
          countframe.loc[-1] = [x,frame.loc[frame[column] == x].shape[0], 0 ]
          countframe.index = countframe.index + 1
     countframe['proportion']=countframe['count']/countframe['count'].sum()
     to_fill=np.random.choice(countframe['name'], size=(frame[column].isnull().sum(),), p=countframe['proportion'])
     frame.loc[isnull, column] = to_fill
     return frame

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 2020-08-29
    • 2020-11-16
    • 2018-09-23
    • 2012-06-21
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多