gpt4 book ai didi

python - 与 Pandas 一起报道

转载 作者:行者123 更新时间:2023-11-30 21:53:13 25 4
gpt4 key购买 nike

我正在尝试使用 Pandas 生成报告,按一组字段分组:

这就是我正在做的事情:

#!/usr/bin/env python3

import pandas as pd

data = [
{
'id': 1,
'name': 'name1',
'pretty_name': 'Pretty Name 1',
'server_name': 'exampleserver.local',
'provider': 'provider1',
'type': 'A',
'status': 'KO'
},
{
'id': 2,
'name': 'name2',
'pretty_name': 'Pretty Name 2',
'server_name': 'exampleserver1.local',
'provider': 'provider2',
'type': 'B',
'status': 'OK'
},
{
'id': 1,
'name': 'name1',
'pretty_name': 'Pretty Name 1',
'server_name': 'exampleserver.local',
'provider': 'provider1',
'type': 'A',
'status': 'KO'
},
{
'id': 1,
'name': 'name1',
'pretty_name': 'Pretty Name 1',
'server_name': 'exampleserver.local',
'provider': 'provider1',
'type': 'A',
'status': 'OK'
},
{
'id': 2,
'name': 'name2',
'pretty_name': 'Pretty Name 2',
'server_name': 'exampleserver.local',
'provider': 'provider2',
'type': 'A',
'status': 'OK'
}
]

df = pd.DataFrame(data)

grouped = df.groupby(['server_name', 'provider', 'type', 'status'])['id'].count()
print(grouped.to_string())

返回结果:

server_name           provider   type  status
exampleserver.local provider1 A KO 2
OK 1
provider2 A OK 1
exampleserver1.local provider2 B OK 1

这没关系,但我想在结果中添加一行,其中包含每个提供商的总计。即

server_name           provider   tot  type  status
exampleserver.local provider1 3 A KO 2
OK 1
provider2 1 A OK 1
exampleserver1.local provider2 1 B OK 1

我很确定使用 Pandas 可以轻松完成此操作,但我花了几个小时阅读文档,但没有成功。

有什么指点吗?

谢谢。

编辑:我已更正并扩展了该示例,因为它并没有真正意义。

最佳答案

如果 provider1DataFrame.assign 匹配,您可以创建辅助列进行比较和 Series.eq ,转换为整数,因此您可以使用 sum 来计算匹配值:

grouped = (df.assign(new=df['provider'].str.contains('provider1').astype(int))
.groupby(['server_name', 'provider', 'type', 'status'])['new']
.agg([('count','size'), ('provider1_count','sum')])
.reset_index())
print (grouped)
server_name provider type status count provider1_count
0 exampleserver.local provider1 A KO 1 1
1 exampleserver.local provider2 A OK 1 0
2 exampleserver.local provider2 B OK 1 0

编辑:

您可以为 DataFramerename 列添加 as_index=False:

df1 = (df.groupby(['server_name', 'provider', 'type', 'status'], as_index=False)['id']
.count()
.rename(columns={'id':'counts'}))

然后,如果想要在位置 2 中添加新列,请使用 DataFrame.insertGroupBy.transform :

df1.insert(2, 'tot', df1.groupby(['server_name','provider'])['counts'].transform('sum'))
print(df1)
server_name provider tot type status counts
0 exampleserver.local provider1 3 A KO 2
1 exampleserver.local provider1 3 A OK 1
2 exampleserver.local provider2 1 A OK 1
3 exampleserver1.local provider2 1 B OK 1

最后,如果需要Multiindex,请使用DataFrame.set_index :

grouped = df1.set_index(['server_name', 'provider', 'tot','type', 'status'])['counts']
print (grouped)
server_name provider tot type status
exampleserver.local provider1 3 A KO 2
OK 1
provider2 1 A OK 1
exampleserver1.local provider2 1 B OK 1
Name: counts, dtype: int64

关于python - 与 Pandas 一起报道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59733569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com