pandas 数据框中列的高效小计
Efficient Subtotaling of columns in a pandas dataframe
我一直在琢磨一个在工作中可以自动生成月末报告的程序的想法。目前,它以 Excel 格式为我们创建所有报告,然后我们手动使用 Excel 的小计功能对其列进行小计并将数据格式化为 table.
我的想法是按客户对每一列进行小计,如下所示:
Patient
Date
Rx#
Description
Qty
Price
EXAMPLE, JOHN
2/1/2021
357649
Aspirin
30
6.99
EXAMPLE, JOHN
2/1/2021
357650
Drug
30
13.99
EXAMPLE, JOHN
2/1/2021
357651
Tylenol
30
7.99
EXAMPLE, JOHN Subtotal
28.97
EXAMPLE, SUSAN
2/12/2021
357652
Expensive Drug
30
51.99
EXAMPLE, SUSAN
2/12/2021
357653
Drug
30
13.99
EXAMPLE, SUSAN
2/12/2021
357654
Tylenol
30
7.99
EXAMPLE, SUSAN Subtotal
73.97
现有数据框如下所示:
Patient
Date
Rx#
Description
Qty
Price
EXAMPLE, JOHN
2/1/2021
357649
Aspirin
30
6.99
EXAMPLE, JOHN
2/1/2021
357650
Drug
30
13.99
EXAMPLE, JOHN
2/1/2021
357651
Tylenol
30
7.99
EXAMPLE, SUSAN
2/12/2021
357652
Expensive Drug
30
51.99
EXAMPLE, SUSAN
2/12/2021
357653
Drug
30
13.99
EXAMPLE, SUSAN
2/12/2021
357654
Tylenol
30
7.99
这可以用 groupby() 实现吗?它似乎可以选择按行分组而不是按列分组。我看到的更大的问题是插入现有数据框,因为 pandas 似乎更适合对大型数据集进行 manipulating/performing 操作而不是 inserting/adding 信息。
# Calculate sums
df_subtotal = df.groupby('Patient', as_index=False)[['Price']].agg('sum')
# Manipulate string Patient
df_subtotal['Patient'] = df_subtotal['Patient'] + ' subtotal'
# Join dataframes
df_new = pd.concat([df, df_subtotal], axis=0, ignore_index=True)
# Sort
df_new = df_new.sort_values(['Patient', 'Date'])
我一直在琢磨一个在工作中可以自动生成月末报告的程序的想法。目前,它以 Excel 格式为我们创建所有报告,然后我们手动使用 Excel 的小计功能对其列进行小计并将数据格式化为 table.
我的想法是按客户对每一列进行小计,如下所示:
Patient | Date | Rx# | Description | Qty | Price |
---|---|---|---|---|---|
EXAMPLE, JOHN | 2/1/2021 | 357649 | Aspirin | 30 | 6.99 |
EXAMPLE, JOHN | 2/1/2021 | 357650 | Drug | 30 | 13.99 |
EXAMPLE, JOHN | 2/1/2021 | 357651 | Tylenol | 30 | 7.99 |
EXAMPLE, JOHN Subtotal | 28.97 | ||||
EXAMPLE, SUSAN | 2/12/2021 | 357652 | Expensive Drug | 30 | 51.99 |
EXAMPLE, SUSAN | 2/12/2021 | 357653 | Drug | 30 | 13.99 |
EXAMPLE, SUSAN | 2/12/2021 | 357654 | Tylenol | 30 | 7.99 |
EXAMPLE, SUSAN Subtotal | 73.97 |
现有数据框如下所示:
Patient | Date | Rx# | Description | Qty | Price |
---|---|---|---|---|---|
EXAMPLE, JOHN | 2/1/2021 | 357649 | Aspirin | 30 | 6.99 |
EXAMPLE, JOHN | 2/1/2021 | 357650 | Drug | 30 | 13.99 |
EXAMPLE, JOHN | 2/1/2021 | 357651 | Tylenol | 30 | 7.99 |
EXAMPLE, SUSAN | 2/12/2021 | 357652 | Expensive Drug | 30 | 51.99 |
EXAMPLE, SUSAN | 2/12/2021 | 357653 | Drug | 30 | 13.99 |
EXAMPLE, SUSAN | 2/12/2021 | 357654 | Tylenol | 30 | 7.99 |
这可以用 groupby() 实现吗?它似乎可以选择按行分组而不是按列分组。我看到的更大的问题是插入现有数据框,因为 pandas 似乎更适合对大型数据集进行 manipulating/performing 操作而不是 inserting/adding 信息。
# Calculate sums
df_subtotal = df.groupby('Patient', as_index=False)[['Price']].agg('sum')
# Manipulate string Patient
df_subtotal['Patient'] = df_subtotal['Patient'] + ' subtotal'
# Join dataframes
df_new = pd.concat([df, df_subtotal], axis=0, ignore_index=True)
# Sort
df_new = df_new.sort_values(['Patient', 'Date'])