假设有一个数据框
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
答案 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