如何在按Date_M和Corporate分组后计算卡车占比并添加至结果表?
问题背景
现有如下Pandas DataFrame:
| Date | Cost | Corporate | Vehicle type | Price | Insurance | Date_M | |
|---|---|---|---|---|---|---|---|
| 0 | 2019-08-26 04:14:00 | 23719 | 0 | automobile | 25903 | 1 | 2019-08 |
| 1 | 2020-08-27 01:21:03 | 17159 | 0 | truck | 24748 | 1 | 2020-08 |
| 2 | 2019-08-26 18:49:04 | 3629 | 0 | truck | 11777 | 0 | 2019-08 |
| 3 | 2020-08-31 16:57:02 | 50738 | 1 | automobile | 51296 | 0 | 2020-08 |
| 4 | 2020-08-23 14:48:02 | 48173 | 0 | truck | 56314 | 0 | 2020-08 |
已执行以下代码筛选无保险数据,按Date_M和Corporate分组统计车辆数及收益率:
import pandas as pd import numpy as np data = { "Date": [ "2019-08-26 04:14:00", "2020-08-27 01:21:03", "2019-08-26 18:49:04", "2020-08-31 16:57:02", "2020-08-23 14:48:02", ], "Cost": [23719, 17159, 3629, 50738, 48173], "Corporate": [0, 0, 0, 1, 0], "Vehicle type": ["automobile", "truck", "truck", "automobile", "truck"], "Price": [25903, 24748, 11777, 51296, 56314], "Insurance": [1, 1, 0, 0, 0], "Date_M": ["2019-08", "2020-08", "2019-08", "2020-08", "2020-08"], } df = pd.DataFrame(data) no_insurance = df['Insurance'] == 0 df_no_insurance = df[no_insurance] results = pd.DataFrame() df_group = df_no_insurance.groupby(['Date_M','Corporate']) results['Number of cars'] = df_group['Date'].count() results['Доходность'] = np.round((df_group['Price'].sum() - df_group['Cost'].sum())/df_group['Price'].sum() * 100, 2)
现在需要计算每组中truck(卡车)的占比,并将其插入results表的新列中,该如何实现?
解决方案
核心思路是统计每组内truck的数量,再除以该组总车辆数得到占比,以下两种方法均可实现:
方法一:基于已有分组补充计算
直接利用已创建的df_group统计卡车数量,再结合已有的车辆数计算占比:
# 统计每组内truck的数量 truck_count = df_group['Vehicle type'].apply(lambda x: (x == 'truck').sum()) # 计算占比并保留两位小数,添加到results表中 results['Truck ratio'] = np.round(truck_count / results['Number of cars'] * 100, 2)
方法二:一次性聚合所有指标
重新定义分组聚合逻辑,一次性完成车辆数、收益率、卡车占比的统计,效率更高:
# 一次性聚合计算所有所需指标 results = df_no_insurance.groupby(['Date_M','Corporate']).agg( Number_of_cars=('Date', 'count'), Доходность=('Price', lambda x: np.round((x.sum() - df_no_insurance.loc[x.index, 'Cost'].sum())/x.sum()*100, 2)), Truck_ratio=('Vehicle type', lambda x: np.round((x == 'truck').sum()/len(x)*100, 2)) ).rename(columns={'Number_of_cars': 'Number of cars'})
最终结果
执行后results的输出如下:
| Date_M | Corporate | Number of cars | Доходность | Truck ratio |
|---|---|---|---|---|
| 2019-08 | 0 | 1 | 69.19 | 100.00 |
| 2020-08 | 0 | 1 | 14.46 | 100.00 |
| 2020-08 | 1 | 1 | 1.09 | 0.00 |
内容的提问来源于stack exchange,提问作者lelelel
相关产品推荐
相关产品推荐

