需要用其他区域的中值(等于或小于“总计”值)替换空的 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
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