Pandas 数据框:按分组聚合后进行转置

7

I have this DataFrame :

df = pd.DataFrame({'1-sensor':['608', '608', '2158', '2158'],
          '2-day':['2017-12-11', '2017-12-12', '2017-12-11', '2017-12-12'],
          '3-voltage':[30, 31, 28, 29]})

df :

  1-sensor       2-day  3-voltage
0      608  2017-12-11         30
1      608  2017-12-12         31
2     2158  2017-12-11         28
3     2158  2017-12-12         29

我希望您能将其改造为这样:

pd.DataFrame({'1-sensor':['608', '2158'],
              '2017-12-11':[30, 28],
              '2017-12-12':[31, 29]})

df :

  1-sensor  2017-12-11  2017-12-12
0      608          30          31
1     2158          28          29

我尝试了不同的解决方案,结合 .groupby('sensor').unstack() 但是没有成功。有什么好的建议吗?
谢谢!

请提供所需的输入/输出作为代码片段,而不是图像。 - Nae
你有任何需要执行的聚合操作吗?如果没有,就不需要使用groupby。 - cs95
1
@Nae 抱歉,我已删除了图片。 - Jusstol
1
@cᴏʟᴅsᴘᴇᴇᴅ,不需要聚合,只需要这个棘手的转换!谢谢 - Jusstol
2个回答

6

选项1
如果没有聚合,使用pivot。这实际上更有效率 -

df.pivot(index='1-sensor', columns='2-day', values='3-voltage')

2-day     2017-12-11  2017-12-12
1-sensor                        
2158              28          29
608               30          31

如果需要执行任何聚合操作,请使用pivot_table并包括aggfunc=...选项2 使用set_index + unstack的另一种解决方案-
df.set_index(['1-sensor', '2-day']).unstack()

          3-voltage           
2-day    2017-12-11 2017-12-12
1-sensor                      
2158             28         29
608              30         31

如果需要聚合,则可以使用groupby+unstack来实现。你离成功只差一步之遥。
df.groupby(['1-sensor', '2-day'], sort=False).sum().unstack()  

          3-voltage           
2-day    2017-12-11 2017-12-12
1-sensor                      
608              30         31
2158             28         29

如果需要使用聚合函数,将sum替换为您想要使用的聚合函数。


1
非常感谢您提供的详细答案。第一个选项完美地解决了问题! - Jusstol

1
您也可以使用 pd.pivot_table 来完成它:
pd.pivot_table(df, index = ['1-sensor'], columns = ['2-day'], values = '3-voltage').reset_index()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接