python - 根据分组数据计算 DataFrame 模式
问题描述
我有以下数据框:
>>> df = pd.DataFrame({"a": [1, 1, 1, 1, 2, 2, 3, 3, 3], "b": [1, 5, 7, 9, 2, 4, 6, 14, 5], "c": [1, 0, 0, 1, 1, 1, 1, 0, 1]})
>>> df
a b c
0 1 1 1
1 1 5 0
2 1 7 0
3 1 9 1
4 2 2 1
5 2 4 1
6 3 6 1
7 3 14 0
8 3 5 1
我想计算c
每个唯一值的列模式,a
然后选择c
具有该值的行。
这是我自己的解决方案:
>>> major_types = df.groupby(['a'])['c'].apply(lambda x: pd.Series.mode(x)[0])
>>> df = df.merge(major_types, how="left", right_index=True, left_on="a", suffixes=("", "_major"))
>>> df = df[df['c'] == df['c_major']].drop(columns="c_major", axis=1)
这将输出以下内容:
>>> df
a b c
1 1 5 0
2 1 7 0
4 2 2 1
5 2 4 1
6 3 6 1
8 3 5 1
这对于大型 DataFrame 来说是非常不够的。知道该怎么做吗?
解决方案
IIUC,GroupBy.transform
而不是apply
+merge
df.loc[df['c'].eq(df.groupby('a')['c'].transform(lambda x: x.mode()[0]))]
a b c
1 1 5 0
2 1 7 0
4 2 2 1
5 2 4 1
6 3 6 1
8 3 5 1
或者
s = df.groupby(['a','c'])['c'].transform('size')
df.loc[s.eq(s.groupby(df['c']).transform('max'))]
推荐阅读
- html - 以最易于访问的方式显示统计信息的正确 HTML 是什么?
- c - C 编程错误:“结构”之前的预期表达式
- linux - 如何修复 Nessus 扫描报告“缺少功能级别访问控制”?
- python - 在 pycharm 上激活现有的 venv
- excel - 按名称查找列标题,然后从多个工作簿中选择标题下方的所有数据,然后将数据粘贴到 Excel VBA 的主文件中的另一个下方
- javascript - 基本相同的代码,但一个导致无限循环的使用效果
- php - Laravel 8 UniSharp File Manager 3 将基本目录从 app/storage 更改为 app/public
- string - Android:使用字符串 ID 调用字符串资源
- firebase - 在我停止并以调试模式重新运行应用程序后,Flutter 会清除移动应用程序目录(不是临时目录)
- css - 如何垂直对齐较小的材质浮动按钮?