17

我有一个如下所示的数据框:

在此处输入图像描述

每个用户有 10 条记录。现在,我想创建一个如下所示的数据框:

userid  name1  name2  ... name10

这意味着我需要反转该列的每 10 条记录name并附加到一个新的数据帧。

那么,它是如何做到的呢?有什么办法可以在 Pandas 中做到这一点?

4

2 回答 2

18

groupby('userid')然后reset_index在每个组内以一致地枚举组。然后unstack获取列。

df.groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()

示范

df = pd.DataFrame([
        [123, 'abc'],
        [123, 'abc'],
        [456, 'def'],
        [123, 'abc'],
        [123, 'abc'],
        [456, 'def'],
        [456, 'def'],
        [456, 'def'],
    ], columns=['userid', 'name'])

df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()

在此处输入图像描述

如果您不想将其userid作为索引,请添加reset_index到末尾。

df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack().reset_index()

在此处输入图像描述

于 2016-07-14T08:54:53.293 回答
2

您可能还对pandas.DataFrame.pivot感兴趣

请参阅此示例数据框:

df
    userid  name  values
0   123     A     1    
1   123     B     2    
2   123     C     3    
3   456     A     4    
4   456     B     5    
5   456     C     6    

使用df.pivot

df.pivot(index='userid', columns='name', values='values')
name  A   B   C
userid
123  1   2   3
456  4   5   6
于 2021-08-10T12:57:30.527 回答