按比例用现有值替换NaN

时间:2018-07-06 15:04:05

标签: python pandas numpy dataframe

让我们说我有一个数据框,它的列Quality的值为[Poor, Average, Good, Excellent]

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

是否有任何简便的方法用NaN中的值替换20 [Poor, Average, Good, Excellent]行,以使整个框架的比例保持在20%不良,30%平均值,40%良好和10%使用Python,Pandas和NumPy很好吗?

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

1 个答案:

答案 0 :(得分:0)

不确定是否有更简单的方法,我编写了此函数来实现所需的功能。

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