python-3.x - 使用最频繁的值按组填充缺失值
问题描述
pandas
我正在尝试使用Python中的模块使用组中最常见的值来估算缺失值。在查看 Stack Overflow 上的一些帖子后,我设法实现了这一点:
import numpy as np
import pandas as pd
df = pd.DataFrame({"group": ["A", "A", "A", "A", "B", "B", "B"],
"value": [1, 1, 1, np.nan, 2, np.nan, np.nan]})
df.groupby("group").transform(lambda x: x.fillna(x.mode().iloc[0]))
运行此代码将填充 1 组“A”的缺失条目和 2 组“B”的两个缺失条目。但是,让我们假设其中一个组仅包含缺失数据(在本例中为组“B”):
df1 = pd.DataFrame({"group": ["A", "A", "A", "A", "B", "B", "B"],
"value": [1, 1, 1, np.nan, np.nan, np.nan, np.nan]})
df1.groupby("group").transform(lambda x: x.fillna(x.mode().iloc[0]))
运行上面的代码会提示一个IndexError: single positional indexer is out-of-bounds
. 我希望正常的行为是保留 np.nan 因为如果您运行该方法mode
,例如,组“B”来自df1
:
df1[df1.group == "B"].mode()
我会知道 NaN 是最常见的值。我怎样才能避免这个问题?
解决方案
运行上面的代码会提示 IndexError: single positional indexer is out-of-bounds
这是因为transform
get 将每一列作为一个系列传递,并且在某些时候它会单独看到该value
列;如果你这样做:
df1[df1.group == "B"].value.mode()
你得到
Series([], dtype: float64)
因此索引越界之类的错误,因为它是空的并且iloc[0]
不存在。
OTOH,当你这样做时:
df1[df1.group == "B"].mode()
mode
是根据数据框而不是系列计算的,pandas 决定在全 NaN 列上给出 NaN,即value
此处的列。
因此,一种补救措施是使用apply
而不是transform
将数据框而不是单个系列传递给您的lambda
:
df1.groupby("group").apply(lambda x: x.fillna(x.mode().iloc[0])).reset_index(drop=True)
要得到
group value
0 A 1.0
1 A 1.0
2 A 1.0
3 A 1.0
4 B NaN
5 B NaN
6 B NaN
推荐阅读
- swift - 如何塑造类似 Ipad 的 Popover 的方向?
- c# - 转换格式时magickimage.net(C#)图像饱和度?
- react-native - 无法运行 Expo 生成的 .apk
- java - 是否从 Spring 5 中删除了 GlobalSession 范围的 bean?为什么?
- yaml - 如何引用 yaml 文件中的值?
- centos7 - 通过mulval生成攻击图
- netsuite - 提交事件后如何获得承诺的项目数量?
- javascript - 条形图不显示
- javascript - 将对象数组转换为对象
- python - 删除除python“列表”中指定的少数文件和目录之外的所有文件和目录