如何在Pandas中按行/水平分组(groupby)

3

假设有一个数据框:

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 对数据进行分组?
文档中可以看到,大多数示例都是按列标签进行分组。但是,还有一些像下面这样的代码:

pandas对象可以在任何轴上拆分。

# 默认为axis=0 grouped = obj.groupby(key)
grouped = obj.groupby(key, axis=1) <- 这似乎是我们想要的
grouped = obj.groupby([key1, key2])

我尝试使用 df.groupby("alpha", axis=1),但它给了我一个 KeyError: 'alpha' 错误。正确的方法是什么?
这是我另一个问题中的一步。在这个问题中,我试图创建
a b c d
1 5 9 2
3 7 4

3
你正在寻找 df.groupby(df.loc['alpha'], axis=1)。但你想要做什么? - cs95
2
为什么不先转置DataFrame呢? - Elmex80s
最初,我试图解决其他问题,这只是我的方法中的一步。然后我想要将值堆叠在一起。我进行了编辑。 - Tai
@Elmex80s 那也可以。 - Tai
@Tai 编辑了我的答案。 - cs95
2个回答

4

如果您想按 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

4
这是您想要的吗?
df.groupby(df.loc['alpha'],axis=1).sum()
Out[405]: 
alpha   a   b   c  d
alpha  aa  bb  cc  d
val     4  12  13  2

编辑
df=df.T
df.assign(key=df.groupby('alpha').cumcount()).pivot('key','alpha','val')
Out[418]: 
alpha  a  b  c     d
key                 
0      1  5  9     2
1      3  7  4  None

我已经编辑了问题!你能再看一下吗?不过这已经足够好了! - Tai
很好的回答!+1 :P - Tai
抱歉,我的投票用完了。请等待一个半小时 ;) - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接