You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在按Date_M和Corporate分组后计算卡车占比并添加至结果表?

问题背景

现有如下Pandas DataFrame:

DateCostCorporateVehicle typePriceInsuranceDate_M
02019-08-26 04:14:00237190automobile2590312019-08
12020-08-27 01:21:03171590truck2474812020-08
22019-08-26 18:49:0436290truck1177702019-08
32020-08-31 16:57:02507381automobile5129602020-08
42020-08-23 14:48:02481730truck5631402020-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_MCorporateNumber of carsДоходностьTruck ratio
2019-080169.19100.00
2020-080114.46100.00
2020-08111.090.00

内容的提问来源于stack exchange,提问作者lelelel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:23:23