熊猫 ::一列的值作为列



数据如下所示:

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为每个事件,当某个事件没有事件时origin_id放置一个 null。数据框中的其他一些列(如serialnorigin_id)应位于生成的列中。此外,每个origin_id应该只有一行

这个问题:如何透视数据帧涉及某些点,尽管它适用于在某个点执行聚合。

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

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

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

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

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

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

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

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

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

有没有其他方法可以做到这一点?

谢谢!

你可以这样做:

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

相关内容

最新更新