如何用Python/Pandas转置含多列组的DataFrame?
嘿,这个数据转置的需求用Python很容易实现!我给你两种方案,按需选择:
方案1:用Pandas(推荐,简洁高效)
Pandas的melt()函数专门用来做这种宽表转长表的操作,几行代码就能搞定:
import pandas as pd # 先把你的原始数据构造成DataFrame data = { 'Date': ['11-30-86', '12-31-86', '01-31-87', '02-28-87'], 'Stock 1': [2.45, -2.57, 13.5, 3.99], 'Stock 2': [0.47021, 1.09626, 9.33911, 4.63777], 'Stock 3': [1.45879, -2.67784, 11.14448, 5.96181] } df = pd.DataFrame(data) # 执行转置:指定Date为保留的标识列,把其他列转成Stock Name和Return transposed_df = df.melt( id_vars='Date', var_name='Stock Name', value_name='Return' ) # 调整列的顺序,完全匹配你想要的格式 transposed_df = transposed_df[['Stock Name', 'Date', 'Return']] # 查看结果 print(transposed_df)
运行后得到的结果就是你想要的格式:
| Stock Name | Date | Return |
|---|---|---|
| Stock 1 | 11-30-86 | 2.45000 |
| Stock 2 | 11-30-86 | 0.47021 |
| Stock 3 | 11-30-86 | 1.45879 |
| Stock 1 | 12-31-86 | -2.57000 |
| Stock 2 | 12-31-86 | 1.09626 |
| Stock 3 | 12-31-86 | -2.67784 |
| ... | ... | ... |
方案2:纯Python实现(无第三方库依赖)
如果不想用Pandas,纯Python遍历数据也能实现,适合轻量场景:
# 原始数据(第一行是表头,后面是数据行) raw_data = [ ['Date', 'Stock 1', 'Stock 2', 'Stock 3'], ['11-30-86', 2.45, 0.47021, 1.45879], ['12-31-86', -2.57, 1.09626, -2.67784], ['01-31-87', 13.5, 9.33911, 11.14448], ['02-28-87', 3.99, 4.63777, 5.96181] ] # 初始化转置后的数据集,先写表头 transposed_data = [['Stock Name', 'Date', 'Return']] # 遍历每一行数据(跳过表头行) for row in raw_data[1:]: current_date = row[0] # 遍历每个股票的收益值(从第二列开始) for idx in range(1, len(row)): stock_name = raw_data[0][idx] return_value = row[idx] transposed_data.append([stock_name, current_date, return_value]) # 打印结果(也可以写入文件) for line in transposed_data: print('\t'.join(str(item) for item in line))
运行后会输出:
Stock Name Date Return Stock 1 11-30-86 2.45 Stock 2 11-30-86 0.47021 Stock 3 11-30-86 1.45879 Stock 1 12-31-86 -2.57 Stock 2 12-31-86 1.09626 Stock 3 12-31-86 -2.67784 ...
内容的提问来源于stack exchange,提问作者rocksteady
相关产品推荐
相关产品推荐

