如何用Pandas实现按host分组并生成含URL Count的目标表格
按IP分组统计URL数量并生成指定格式表格
需求说明
需要生成包含host、url、URL Count三个表头的表格,将每个IP地址关联的URL分组展示,URL Count列为对应IP的总URL数量。
原始代码(不符合预期)
import pandas as pd import numpy as np data = {'host': ['1.1.1.1', '192.168.1.1', '192.168.1.1', '192.168.1.1', '172.16.1.2', '192.168.1.1', '172.16.1.2', '10.2.3.4', '10.0.0.1', '10.0.0.1'], 'url': ['capps.test.com', 'attilab-admin.test.com', 'emea-solutions-admin.test.com', 'ilab-admin.test.com', 'learning.test.com', 'mktextfw.test.com', 'sandbox.learning.test.com', 'mynetwork.test.com', 'www.letsdoit.com', 'www.mysite.com']} df = pd.DataFrame(data) df['URL Count'] = df.groupby('host')['url'].transform('count') df.pivot(index='host', columns='url') df2 = df.set_index(['host', 'url']) df.groupby(['host', 'url']).size() stacked = pd.DataFrame(df2.stack()) print(stacked)
解决方案
无需复杂的pivot或stack操作,只需统计每个IP的URL总数并合并回原表即可实现需求:
正确代码
import pandas as pd data = {'host': ['1.1.1.1', '192.168.1.1', '192.168.1.1', '192.168.1.1', '172.16.1.2', '192.168.1.1', '172.16.1.2', '10.2.3.4', '10.0.0.1', '10.0.0.1'], 'url': ['capps.test.com', 'attilab-admin.test.com', 'emea-solutions-admin.test.com', 'ilab-admin.test.com', 'learning.test.com', 'mktextfw.test.com', 'sandbox.learning.test.com', 'mynetwork.test.com', 'www.letsdoit.com', 'www.mysite.com']} df = pd.DataFrame(data) # 统计每个host的URL总数,转为带列名的DataFrame url_counts = df.groupby('host')['url'].count().reset_index(name='URL Count') # 将统计结果与原表合并,保留所有行 result_df = pd.merge(df, url_counts, on='host') # 按host排序并重置索引,输出更规整 result_df = result_df.sort_values('host').reset_index(drop=True) print(result_df)
代码说明
- 统计URL总数:通过
groupby('host')['url'].count()计算每个IP对应的URL总数量,用reset_index(name='URL Count')将结果转为结构化DataFrame,指定列名为URL Count。 - 合并数据:使用
pd.merge将统计结果与原DataFrame按host列关联,确保每一行都带上对应IP的总URL数。 - 规整输出:按
host排序并重置索引,让输出表格的IP分组更清晰。
最终输出
| host | url | URL Count |
|---|---|---|
| 1.1.1.1 | capps.test.com | 1 |
| 10.0.0.1 | www.letsdoit.com | 2 |
| 10.0.0.1 | www.mysite.com | 2 |
| 10.2.3.4 | mynetwork.test.com | 1 |
| 172.16.1.2 | learning.test.com | 2 |
| 172.16.1.2 | sandbox.learning.test.com | 2 |
| 192.168.1.1 | attilab-admin.test.com | 4 |
| 192.168.1.1 | emea-solutions-admin.test.com | 4 |
| 192.168.1.1 | ilab-admin.test.com | 4 |
| 192.168.1.1 | mktextfw.test.com | 4 |
内容的提问来源于stack exchange,提问作者timlaw71
相关产品推荐
相关产品推荐

