python - 在 Pandas 中按元素和计数对数据框进行分组
问题描述
我从以下形式的数据框开始:
scope provider1 provider2 provider3
------------------------------------------
h1 A AA AAA
c12 B AA BBB
hn3 A BB AAA
hs34 C CC BBB
623x B DD CCC
m23 A AA BBB
其中A
和是三个完全不同的标签AA
。AAA
我想计算每个标签出现的次数并获取数据框:
label provider value_count
-------------------------------
A provider1 3
B provider1 2
C provider1 1
AA provider2 3
BB provider2 1
CC provider2 1
DD provider2 1
AAA provider3 2
BBB provider3 3
CCC provider3 1
我怎样才能做到这一点?
解决方案
DataFrame.melt
与聚合一起使用GroupBy.size
:
df = (df.melt('scope', value_name='label', var_name='provider')
.groupby(['provider','label'])
.size()
.reset_index(name='value_count')
)
print (df)
provider label value_count
0 provider1 A 3
1 provider1 B 2
2 provider1 C 1
3 provider2 AA 3
4 provider2 BB 1
5 provider2 CC 1
6 provider2 DD 1
7 provider3 AAA 2
8 provider3 BBB 3
9 provider3 CCC 1
DataFrame.set_index
与和替代DataFrame.stack
:
df = (df.set_index('scope')
.stack()
.rename_axis(['scope','provider'])
.reset_index(name='label')
.groupby(['provider','label'])
.size()
.reset_index(name='value_count')
)
print (df)
provider label value_count
0 provider1 A 3
1 provider1 B 2
2 provider1 C 1
3 provider2 AA 3
4 provider2 BB 1
5 provider2 CC 1
6 provider2 DD 1
7 provider3 AAA 2
8 provider3 BBB 3
9 provider3 CCC 1
推荐阅读
- r - 在 R studio 中安装 factoextra 包
- typescript - 修复 Visual Studio Code 中的“继续而不扫描任务输出”
- reactjs - 反应:缺少函数的返回类型。eslint(@typescript-eslint/explicit-function-return-type)
- javascript - 在 localhost 上运行 webapp 时出现 ERR_NAME_NOT_RESOLVED 错误
- ms-access - 从数据表访问复制会产生额外的报价
- aws-api-gateway - AWS lambda serverless,在重新部署 api-gateway 子域更改时
- python - 为什么我需要在 Keras 中编译和拟合预训练模型?
- xml - 格式化 Tenantalert xml api
- windows - 如何让 Expo CLI 服务器选择正确的网络?
- python - 循环执行一系列计算并打印迭代次数