![](/img/trans.png)
[英]Is it possible to combine agg and value_counts in single line with Pandas
[英]Using pandas .agg to do value_counts() twice
我正在尝试在数据帧上执行 groupby,在该数据帧上我同时使用.agg
应用value_counts(normalize=True)
和value_counts(normalize=False)
。
但是,我无法找到一种方法来做到这一点而不会引发错误。 我在这里尝试了多种方法: 使用 Pandas GroupBy.agg() 对同一列进行多次聚合,但似乎没有一个对我有用。 对我来说问题的一部分是必须将 normalize 传递给 value_counts。
我创建了一个像这样使用的测试示例:
example = pd.DataFrame({'A': ['a','a','a','b','b','c'], 'B':[1,1,2,3,3,4]})
这给了我:
+---+---+---+
| | A | B |
+---+---+---+
| 0 | a | 1 |
| 1 | a | 1 |
| 2 | a | 2 |
| 3 | b | 3 |
| 4 | b | 3 |
| 5 | c | 4 |
+---+---+---+
我想回来:
A B False True
a 1 2 0.666
2 1 0.333
b 3 2 1.000
c 3 1 1.000
做类似的事情:
example.groupby('A')['B'].value_counts(normalize=True)
给了我一半我想要的,但我永远无法让.agg
工作
谢谢
这里agg
不是很好,因为pd.Series.value_counts
返回一个 Series 并且要获得规范化的结果,它需要额外的聚合级别。 任一concat
不同value_counts
或手动第一后计算的百分比groupby
。
pd.concat([df.groupby('A').B.value_counts().rename('N'),
df.groupby('A').B.value_counts(normalize=True).rename('pct')], axis=1)
# or
res = df.groupby('A').B.value_counts().rename('N')
res = pd.concat([res, (res/res.groupby(level='A').transform('sum')).rename('pct')], axis=1)
N pct
A B
a 1 2 0.666667
2 1 0.333333
b 3 2 1.000000
c 4 1 1.000000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.