如何将Pandas时间序列DataFrame按日期聚合并转置为宽格式?
如何将长格式时间序列DataFrame转换为宽格式?
原始DataFrame定义:
import pandas as pd dataframe = pd.DataFrame({ 'date': pd.to_datetime([ '2020-04-01', '2020-04-02', '2020-04-03', '2020-04-01', '2020-04-02', '2020-04-03']), 'Ticker': ['A', 'A', 'A', 'AAPL', 'AAPL', 'AAPL'], 'Price': ['8', '10', '12', '100', '200', '50']})
原始数据展示:
date Ticker Price 0 2020-04-01 A 8 1 2020-04-02 A 10 2 2020-04-03 A 12 3 2020-04-01 AAPL 100 4 2020-04-02 AAPL 200 5 2020-04-03 AAPL 50
期望转换后的DataFrame定义:
dataframe_2 = pd.DataFrame({ 'date': pd.to_datetime(['2020-04-01', '2020-04-02','2020-04-03']), 'A': [8, 10, 12], 'AAPL': [100, 200, 50]})
期望数据展示:
date A AAPL 0 2020-04-01 8 100 1 2020-04-02 10 200 2 2020-04-03 12 50
解决方法
你需要的是长格式转宽格式的操作,groupby不适合做这类结构转换,推荐使用pivot或pivot_table函数:
方法1:使用pivot(无重复记录场景)
先把Price列从字符串转为数值类型,再执行转置:
# 转换Price列为数值类型 dataframe['Price'] = dataframe['Price'].astype(int) # 执行pivot转置 dataframe_2 = dataframe.pivot(index='date', columns='Ticker', values='Price').reset_index() # 清除列名的层级标签 dataframe_2.columns.name = None
方法2:使用pivot_table(含重复记录场景)
如果数据中存在同一date+Ticker的重复记录,pivot_table可以通过聚合函数处理(比如取首个值、均值、求和),这里用first取第一条记录即可:
dataframe['Price'] = dataframe['Price'].astype(int) dataframe_2 = dataframe.pivot_table(index='date', columns='Ticker', values='Price', aggfunc='first').reset_index() dataframe_2.columns.name = None
执行上述代码后,就能得到你需要的宽格式DataFrame。
内容的提问来源于stack exchange,提问作者Stephen Lin
相关产品推荐
相关产品推荐

