关于python:Pandas:GroupBy到DataFrame

Pandas: GroupBy to DataFrame

有一个非常流行的S.O.问题关于GroupBy到DataFrame,请参见此处。不幸的是,我不认为这个特定的用例是最有用的。

假设您有一个扁平形式的分层数据集:

例如

1
2
3
4
5
     key    val
0    'a'    2
1    'a'    1
2    'b'    3
3    'b'    4

我要做的是将该数据帧转换为此结构

1
2
3
    'a'  'b'
0    2    3
1    1    4

我以为这会像

1
pd.DataFrame(df.groupby('key').groups)

但事实并非如此。

那么,我如何才能实现这一转变呢?


1
2
3
4
5
6
df.assign(index=df.groupby('key').cumcount()).pivot('index','key','val')
Out[369]:
key    'a'  'b'
index          
0        2    3
1        1    4


下面的方法怎么样?

1
2
3
4
5
In [134]: pd.DataFrame(df.set_index('val').groupby('key').groups)
Out[134]:
   a  b
0  2  3
1  1  4


认为这应该有效。注意,这个例子与op的不同。这个例子中有重复的。

1
2
3
df = pd.DataFrame({'key': {0:"'a'", 1:"'a'", 2:"'b'", 3:"'b'", 4:"'a'
<hr><P>让我们用<wyn>set_index</wyn>和<wyn>unstack</wyn>与<wyn>cumcount</wyn>一起使用:</P>[cc lang="
python"]df.set_index([df.groupby('key').cumcount(),'key'])['val']\
  .unstack().rename_axis(None,1)

输出:

1
2
3
   'a'  'b'
0    2    3
1    1    4

我对熊猫不熟悉,但这似乎很管用:

1
2
3
4
5
6
gb = df.groupby('key')
k = 'val'
pd.DataFrame(
    [gb.get_group(x)[k].tolist() for x in gb.groups],
    index=[x for x in gb.groups]
).transpose()