如何分组行/水平(熊猫)

时间:2018-01-14 21:42:28

标签: 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对象可以在任何轴上分割。

     

#default是axis = 0   groups = 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

2 个答案:

答案 0 :(得分:2)

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

根据您的修改,使用groupby参数调用apply + pd.Series,然后创建新的数据框。

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

答案 1 :(得分:2)

这就是你想要的吗?

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