Pandas报道

2024-10-01 13:36:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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

我很确定熊猫可以很容易地做到这一点,但我花了几个小时阅读文档,运气不好

有什么建议吗

谢谢

编辑:我已经纠正并扩展了这个例子,因为它没有真正意义


Tags: nameidserverlocaltypestatusprettyok
1条回答
网友
1楼 · 发布于 2024-10-01 13:36:14

如果将provider1^{}^{}匹配,则可以创建用于比较的帮助器列,并将其转换为整数,因此可以使用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位置,请使用^{}^{}

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使用^{}

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

相关问题 更多 >