You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Python(Pandas)中将长格式数据转换为宽格式的技术求助

解决Pandas长格式转宽格式的问题

嘿,我来帮你搞定这个长转宽的需求!你想要把按日期和股票代码分散的收益率数据,转换成以股票为行、日期为列的宽表,用Pandas的pivot方法就能轻松实现,比你之前尝试的堆叠操作更直接。

步骤1:先构造你的示例数据(方便测试)

首先先把你给出的原始数据转换成Pandas DataFrame,注意我修正了2月的日期(2月没有31号,避免后续报错):

import pandas as pd

data = {
    'OBS': [1, 2, 3, 4],
    'date': [20050131, 20050228, 20050131, 20050228],
    'TICKER': ['AAPL', 'AAPL', 'GOOG', 'GOOG'],
    'RET': [0.02, 0.01, 0.05, 0.03]
}
df = pd.DataFrame(data)

步骤2:用pivot实现长转宽

pivot方法刚好匹配你的需求:指定index为行标识(TICKER),columns为要展开成列的字段(date),values为填充到单元格的数据(RET):

# 执行长转宽
wide_df = df.pivot(index='TICKER', columns='date', values='RET').reset_index()
# 去掉列名的默认标签(避免出现"date"作为顶部的额外标签)
wide_df.columns.name = None

执行后你就能得到期望的结果:

TICKER  20050131  20050228
0    AAPL      0.02      0.01
1    GOOG      0.05      0.03

特殊情况处理:如果存在重复的(TICKER, date)组合

如果你的数据里同一个股票在同一天有多个收益率记录,可以用pivot_table做聚合(比如取均值、求和等):

# 以均值为例聚合重复值
wide_df = df.pivot_table(
    index='TICKER', 
    columns='date', 
    values='RET', 
    aggfunc='mean'  # 可以换成'sum'、'max'等你需要的聚合方式
).reset_index()
wide_df.columns.name = None

补充说明:为什么之前的堆叠操作不对?

你提到的“堆叠”应该是指stack()方法,它的作用是宽格式转长格式,和你现在的需求刚好相反。而我们用的pivot/pivot_table才是专门用来实现长转宽的工具哦~

内容的提问来源于stack exchange,提问作者SK23

火山引擎 最新活动