有必要用其他区域的中间值(等于或小于"总"值)替换空Nan值("面积"列). 例如: 第2行的值为"total"==8. Select 值为"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

推荐答案

首先计算每个组的中位数(使用groupby.median),用dropna删除NaN,并执行merge_asof来映射缺失的值.使用输出将NaN填充boolean indexing:

tmp = df.groupby('total')['area'].median().dropna()

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

输出:

   total  area
0      5  40.0
1      8  51.0
2      8  53.0
3      8  52.0
4     20  52.0
5     56  34.0
6     59  34.0

Python相关问答推荐

即使在可见的情况下也不相互作用

Gekko:Spring-Mass系统的参数识别

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

python中字符串的条件替换

python中的解释会在后台调用函数吗?

如何在Python中使用另一个数据框更改列值(列表)

Python全局变量递归得到不同的结果

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

使用字典或列表的值组合

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

为用户输入的整数查找根/幂整数对的Python练习

如何获得3D点的平移和旋转,给定的点已经旋转?

Python Mercury离线安装

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

504未连接IB API TWS错误—即使API连接显示已接受''

我什么时候应该使用帆布和标签?

Seaborn散点图使用多个不同的标记而不是点

删除Dataframe中的第一个空白行并重新索引列

将字节序列解码为Unicode字符串

将相应的值从第2列合并到第1列(Pandas )