基于Pandas实现按年份分组统计协议数、条款总数及平均条款数
Pandas分组统计协议与条款数据
你可以通过分组后多指标聚合的方式一次性得到所有需要的结果,这里提供两种简洁的实现思路:
方法一:先计算单条协议的条款总数(直观易懂)
先给原数据新增一列,统计每一条协议包含的条款总数,再按年份分组聚合:
import pandas as pd d = {'Agreements': ["Rome", "NewYork", "Paris", "Tokyo"], 'Year': [2012, 2012, 2013, 2013], 'Provision1': [1, 1, 1, 1], 'Provision2': [1, 1, 0, 1], 'Provision3': [0, 1, 1, 0]} df = pd.DataFrame(data=d) # 新增列:单条协议的条款总数 df['Total_Provisions'] = df[['Provision1', 'Provision2', 'Provision3']].sum(axis=1) # 按年份分组,同时计算三个指标 result = df.groupby('Year').agg( **{'Count Agreements per Year': ('Agreements', 'count'), 'Count Provisions per Year': ('Total_Provisions', 'sum'), 'Average Provision per Year': ('Total_Provisions', 'mean')} ).reset_index() print(result)
方法二:直接在聚合函数中计算(无需新增列)
如果不想修改原数据,可以在分组的lambda函数中直接计算条款总和:
import pandas as pd d = {'Agreements': ["Rome", "NewYork", "Paris", "Tokyo"], 'Year': [2012, 2012, 2013, 2013], 'Provision1': [1, 1, 1, 1], 'Provision2': [1, 1, 0, 1], 'Provision3': [0, 1, 1, 0]} df = pd.DataFrame(data=d) result = df.groupby('Year').agg( **{'Count Agreements per Year': ('Agreements', 'count'), 'Count Provisions per Year': (lambda x: x[['Provision1','Provision2','Provision3']].sum().sum()), 'Average Provision per Year': (lambda x: x[['Provision1','Provision2','Provision3']].sum().sum() / len(x))} ).reset_index() print(result)
两种方法最终都会得到你需要的结果:
| Year | Count Agreements per Year | Count Provisions per Year | Average Provision per Year |
|---|---|---|---|
| 2012 | 2 | 5 | 2.5 |
| 2013 | 2 | 4 | 2.0 |
内容的提问来源于stack exchange,提问作者jhonccc
相关产品推荐
相关产品推荐

