使用Pandas按GRP分组统计DataFrame多HOST列元素出现次数
嘿,这需求用pandas就能轻松搞定!我给你一步步拆解实现:
实现思路
核心就是把宽格式的HOST列转成长格式,再按分组统计次数,分两步走:
- 把HOST1、HOST2、HOST3三列“堆叠”成一列,保留GRP分组信息
- 按GRP和HOST组合分组,统计每个主机在对应分组里的出现次数
完整代码示例
首先我们先构造你的示例数据,然后执行处理逻辑:
import pandas as pd # 构造示例DataFrame data = { 'GRP': [0,1,1,1,1,2,2,2], 'HOST1': ['srv39','srv102','srv101','srv101','srv36','srv100','srv100','srv38'], 'HOST2': ['srv45','srv36','srv36','srv34','srv49','srv47','srv45','srv49'], 'HOST3': ['srv47','srv38','srv45','srv45','srv50','srv48','srv49','srv47'], 'FILESIZE': [203498176,452763956,453277268,448174741,452728577,454617541,454617541,454617541] } df = pd.DataFrame(data) # 步骤1:宽表转长表,把三个HOST列合并成一列 long_df = df.melt( id_vars='GRP', # 保留分组列 value_vars=['HOST1', 'HOST2', 'HOST3'], # 需要堆叠的列 value_name='HOST' # 堆叠后的列名 ) # 步骤2:分组统计次数 result = long_df.groupby(['GRP', 'HOST']).size().reset_index(name='count') # 查看最终结果 print(result)
输出结果
运行后你会得到如下格式的统计结果:
GRP HOST count 0 0 srv39 1 1 0 srv45 1 2 0 srv47 1 3 1 srv101 2 4 1 srv102 1 5 1 srv34 1 6 1 srv36 3 7 1 srv38 1 8 1 srv45 2 9 1 srv49 1 10 1 srv50 1 11 2 srv100 2 12 2 srv38 1 13 2 srv45 1 14 2 srv47 2 15 2 srv48 1 16 2 srv49 3
关键步骤解释
melt函数:这是pandas处理宽表转长表的核心工具,它帮我们把分散在三列的HOST信息合并到一列,同时保留每个HOST对应的GRP分组。groupby(...).size():按GRP和HOST的组合分组后,size()会自动计算每组的行数,也就是该主机在对应分组里的出现次数,最后用reset_index()把分组索引转成普通列,并重命名计数列为count。
内容的提问来源于stack exchange,提问作者Gioachino Bartolotta
相关产品推荐
相关产品推荐

