Pandas ::一列的值作为列

时间:2017-12-29 18:49:51

标签: python pandas pivot

数据如下所示:

origin_id   type   serialn     event    year    month    day
1              A       101        X1    2017        6     10
1              A       101        X2    2017        6     10
1              B       101        X3    2017        6     10
2              A       151        X1    2016        7     15
2              B       151        X3    2016        7     15
2              C       151        X4    2016        7     15

我需要这样:

origin_id    serialn   X1    X2    X3   X4    year    month    day
        1        101    A     A     B null    2017        6     10
        2        151    A  null     B    C    2016        7     15

所以基本上我需要的是使用列event的值作为标题,并为每个事件添加列type的值,当某个{{1}没有事件时把一个空。数据框中的其他一些列(例如origin_idserialn)应位于结果列中。每个origin_id

也应该只有一行

这个问题:How to pivot a dataframe涉及某些方面,尽管它在某些时候都是为了进行聚合。

这是一种可能的解决方案。

我得到一个df,其中origin_id为索引,事件为列,类型为其值。

origin_id

现在我需要原始数据框中的一些信息,所以我只为每个origin_id保留一个事件并删除我不会使用的列

stat = df.pivot(values='type', index='origin_id', columns='event')

合并两个数据帧,df1使用origin_id的值和使用索引的stat。

df1 = df.drop_duplicates(subset='origin_id').drop(['type','event'], axis=1)

使用带有上述代码的第一个数据帧,我得到了这个结果:

pd.merge(df1, stat, how='inner', left_on = 'origin_id', right_index = True)

还有其他办法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以这样做:

In [85]: df.pivot_table(index=df.columns.drop(['event','type']).tolist(),
                        columns='event',
                        values='type',
                        aggfunc='first') \
            .reset_index()
            .rename_axis(None,1)
Out[85]:
   origin_id  serialn  year  month  day X1    X2 X3    X4
0          1      101  2017      6   10  A     A  B  None
1          2      151  2016      7   15  A  None  B     C