【问题标题】:Pandas DataFrame groupby apply and re-expand along grouped axisPandas DataFrame groupby 沿分组轴应用和重新扩展
【发布时间】:2026-01-29 11:25:01
【问题描述】:

假设我有一个数据框

            A   B   C   D
2019-01-01  1   10  100 12
2019-01-02  2   20  200 23
2019-01-03  3   30  300 34

还有一个用于对列进行分组的数组

array([0, 1, 0, 2])

我希望按数组(在列轴上)对数据框进行分组,应用一个函数,然后返回一个具有列数长度的系列,其中包含每列上应用函数的结果。

因此,对于上述情况(应用函数获取组的总和),想要输出:

A    606
B     60
C    606
D     69
dtype: int64

我的最佳尝试:

func = lambda a: np.full(a.shape[1], np.sum(a.values))
df.groupby(groups, axis=1).apply(func)

0    [606, 606]
1          [60]
2          [69]
dtype: object

(在本例中,应用函数在组内返回相等的值,但不能保证真实情况)

我看不到如何使用 pandas 分组语法来做到这一点,除非我遗漏了什么。谁能帮忙,谢谢!

【问题讨论】:

  • 该示例所需的输出是什么?

标签: python dataset pandas


【解决方案1】:

试试这个:

import numpy as np
import pandas as pd


groups = [0, 1, 0, 2]

df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [10, 20, 30],
                   'C': [100, 200, 300],
                   'D': [12, 23, 34]})

temp = df.apply(sum).to_frame()

temp.index = pd.MultiIndex.from_arrays(
    np.stack([temp.index, groups]),
    names=("df columns", "groups")
)

temp_filter = temp.groupby(level=1).agg(sum)

result = temp.join(temp_filter, rsuffix='0'). \
    set_index(temp.index.get_level_values(0))["00"]

# df columns
# A    606
# B     60
# C    606
# D     69
# Name: 00, dtype: int64

【讨论】: