如何使用基于其他值相似的列的列表中的中值来填充空 NaN 数据

问题描述 投票:0回答:1

需要用其他区域的中值(等于或小于“总计”值)替换空的 Nan 值(“区域”列)。 例如: 第 2 行的值为“total”==8。 选择值为“total”==8 的表,查找“area”.median() 的中位数并写入该值(如果有)。 如果没有值,则将“总计”减 1 并进一步搜索。 第 6 行的值“total”==59。因此,我们取“total”的中位数==56,“area”的值=34。

数据应如下所示:结果

import pandas as pd
import numpy as np

df = pd.DataFrame({'total': [5, 8, 8, 8, 20, 56, 59], \
'area': [40, 51, 53, np.nan, np.nan, 34, np.nan]})
df

#   total   area
0   5   40.0
1   8   51.0
2   8   53.0
3   8   NaN
4   20  NaN
5   56  34.0
6   59  NaN
result = pd.DataFrame({'total': [5, 8, 8, 8, 20, 56, 59], 'area': [40, 51, 53, 52, 52, 34, 34]})
result

#   total   area
0   5   40
1   8   51
2   8   53
3   8   52
4   20  52
5   56  34
6   59  34

我创建了一个函数,但它没有产生所需的结果:

def find_area(total_num, x=1):
    while x > 0:
        y = df.query('total == @total_num')['area'].sum()
        if y > 0:
            return df.query('total == @total_num')['area'].median()
            x=0
            break
        else:
            total_num -= 1

df['area'] = df['area'].fillna(find_area)
df
python pandas dataframe function fillna
1个回答
0
投票

首先计算每组的中位数,

dropna
,然后执行
merge_asof
。使用输出通过布尔索引来填充NaN:

tmp = df.groupby('total')['area'].median().dropna()
tmp[1000] = tmp.iloc[-1]

df.loc[df['area'].isna(),
       'area'] = pd.merge_asof(df['total'].reset_index(),
                               tmp, on='total', direction='forward'
                              ).set_index('index')['area']

输出:

   total  area
0      5  40.0
1      8  51.0
2      8  53.0
3      8  52.0
4     20  34.0
5     56  34.0
6     59  34.0
© www.soinside.com 2019 - 2024. All rights reserved.