数据如下所示:
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。数据框中的其他一些列(如serialn
和origin_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