首页 > 解决方案 > 按比例将 NaN 替换为现有值

问题描述

假设我有一个 Dataframe,它有一列Quality,带有 values [Poor, Average, Good, Excellent]

该帧有 120 个值,其中 20 个是NaN,其余 100 个值分别为 20、30、40、10 [Poor, Average, Good, Excellent]

是否有任何简单的方法可以使用 Python、Pandas 和 NumPy将 20NaN行替换为以下值,以使整体框架的比例保持在 20% 差、30% 平均、40% 好和 10% 优秀?[Poor, Average, Good, Excellent]

这个想法是在填充后保留原始比例,NaN而与数据集的大小无关。

标签: pythonpandasnumpydataframe

解决方案


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

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

推荐阅读