python - 如何按行/水平分组(Pandas)

标签 python pandas pandas-groupby

假设有一个数据框

df = pd.DataFrame([['a','a','b','b','c','d', 'c'],
                   [1, 3, 5, 7, 9, 2, 4]], index=["alpha", "val"])


        0   1   2   3   4   5   6
alpha   a   a   b   b   c   d   c
  val   1   3   5   7   9   2   4

我们能否按alpha 对数据进行分组?

我目前从 documentation 中看到的内容大多数示例都是按列标签分组的。尽管如此,还是有类似

的行

pandas objects can be split on any of their axes.

# default is axis=0 grouped = obj.groupby(key)
grouped = obj.groupby(key, axis=1) <- seems to be what we want
grouped = obj.groupby([key1, key2])

我尝试使用 df.groupby("alpha", axis=1),但它给了我 KeyError: 'alpha' 这样做的正确方法是什么?

这是我解决另一个问题的一个步骤。在问题中,我尝试创建

a b c d
1 5 9 2
3 7 4

最佳答案

IIUC,如果您想按 alpha 列对 val 行进行分组,那很容易。您可以将系列或列表作为参数传递给 groupby

图表 A -

df.loc['val'].groupby(df.loc['alpha']).sum()

alpha
a     4
b    12
c    13
d     2
Name: val, dtype: int64

如果您正在执行分组操作,请指定 axis=1 -

df.groupby(df.loc['alpha'], axis=1).agg(...)

根据 Elmex80 的评论,这是带有转置的等效版本,这也是可能的 -

df.T.groupby('alpha').val.sum()

alpha
a     4
b    12
c    13
d     2
Name: val, dtype: int64

根据您的编辑,使用 pd.Series 参数调用 groupby + apply,然后创建一个新数据框。

v = df.loc['val'].groupby(df.loc['alpha']).apply(pd.Series.tolist)

或者,

v = df.T.groupby('alpha').val.apply(pd.Series.tolist)

下一步,

pd.DataFrame(v.tolist(), index=v.index).T

alpha    a    b    c    d
0      1.0  5.0  9.0  2.0
1      3.0  7.0  4.0  NaN

关于python - 如何按行/水平分组(Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48254454/

相关文章:

python - lstm 时间序列的多步序列的数据转换

python - 根据多列聚合函数的条件结果计算唯一记录

python - Pandas 中的分层多索引计数

python - 数据框条件过滤器长列表列

python - 在python中将字典转换为排序字典

python - 按条件分组并计算子组的总和

python - 如何使用 Python 和 ctypes 处理指向指针的指针

python - 一旦另一个单元完成,就评估一个单元

python - 何时使用 iloc 和 loc 作为 bool 值

python - 对行进行分组并定义列聚合规则