数据如下所示:
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_id
和serialn
)应位于结果列中。每个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)
还有其他办法吗?
谢谢!
答案 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