分组,统计和计算Pandas的比例?

2024-09-28 13:29:02 发布

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

我有一个数据帧如下:

d = {
  'id': [1, 2, 3, 4, 5], 
  'is_overdue': [True, False, True, True, False],
  'org': ['A81001', 'A81002', 'A81001', 'A81002', 'A81003']
}
df = pd.DataFrame(data=d)

现在我想为每个组织计算出过期行的百分比,以及未过期行的百分比。在

我知道如何按组织和过期状态分组:

^{pr2}$

但我如何按组织获得比例呢?我想以这样的方式结束:

org      is_overdue   not_overdue   proportion_overdue
A81001   2            0             100
A81002   1            1             50
A81003   0            1             0

Tags: 数据orgidfalsetruedataframedfdata
3条回答

您可以使用^{}。在

首先按组织分组,统计逾期/未逾期的数量。然后计算百分比。在

df_overdue = df.groupby(['org']).apply(lambda dft: pd.Series({'is_overdue': dft.is_overdue.sum(), 'not_overdue': (~dft.is_overdue).sum()}))
df_overdue['proportion_overdue'] = df_overdue['is_overdue'] / (df_overdue['not_overdue'] + df_overdue['is_overdue'])

print(df_overdue)

输出

^{pr2}$

您可以使用pd.crosstab来创建一个频率表,即为每个org计算is_overdue的数目。在

import pandas as pd
d = {
  'id': [1, 2, 3, 4, 5], 
  'is_overdue': [True, False, True, True, False],
  'org': ['A81001', 'A81002', 'A81001', 'A81002', 'A81003']
}
df = pd.DataFrame(data=d)

result = pd.crosstab(index=df['org'], columns=df['is_overdue'], margins=True)
result = result.rename(columns={True:'is_overdue', False:'not overdue'})
result['proportion'] = result['is_overdue']/result['All']*100
print(result)

收益率

^{pr2}$

有更有效的方法来实现这一点,但由于您最初尝试使用聚合函数,因此使用聚合函数可以解决您的问题:

df.is_overdue = df.is_overdue.map({True: 1, False: 0})
df.groupby(['org'])['is_overdue'].agg({'total_count':'count', 'is_overdue':   'sum'}).reset_index()

现在你可以很容易地计算出未逾期和逾期比例。在

相关问题 更多 >

    热门问题