根据分组依据中的值数而不是完整数据透视表来透视数据

时间:2019-05-20 21:37:21

标签: python pandas pivot

我正在尝试在pandas中旋转数据框。在下面的示例中,枢轴将在id列上,而value是value列。但是,我希望不是(3)通用ID列,因为每个类型通常只有1-3个ID,而不是通常的枢轴,在每个ID中每个ID都是它们自己的列(在我的实际数据集中是数千个)。

我尝试在熊猫中使用数据透视表和数据透视表功能。我也一直在与groupby玩耍而没有聚集。还有更直接的解决方案吗?我要达到的目标有一个术语吗?

Starting Sample Dataset: 

type id    value
A    123   11.9
A    234   10.2
A    129   19.3
B    123   11.9
B    189   12.2
B    120   17.8
C    120   17.8
C    139   17.9
D    110   8.5

Desired Output:

type id1    id2    id3 
A    11.9   10.2   19.3  
B    11.9   12.2   17.8  
C    17.8   17.9   Nan
D    8.5    Nan    Nan


2 个答案:

答案 0 :(得分:0)

首先创建虚拟列ID,然后使用该ID进行分组

df1['aux'] = df1.groupby('type')['id'].cumcount().reset_index()[0].values
df1.pivot(index='type', columns = 'aux', values = 'value')

输出:

aux      0     1     2
type                  
A     11.9  10.2  19.3
B     11.9  12.2  17.8
C     17.8  17.9   NaN
D      8.5   NaN   NaN

答案 1 :(得分:0)

cumcountpivot_tableadd_prefix

首先,我们可以使用cumcount创建新ID,因为它们在type组中是连续的:

然后,我们可以着眼于这个新的id并使用add_prefix获得所需的列名:

df['id2'] = df.groupby(['type']).cumcount()+1

piv = df.pivot_table(index='type', columns='id2', values='value')\
        .add_prefix('id_')\
        .reset_index()\
        .rename_axis(None, axis=1)

  type  id_1  id_2  id_3
0    A  11.9  10.2  19.3
1    B  11.9  12.2  17.8
2    C  17.8  17.9   NaN
3    D   8.5   NaN   NaN