问题描述
上下文
我正在尝试使用如下所示的MultiIndex编写Pandas DataFrame的csv文件:
import pandas as pd
import numpy as np
# Dirty generation of fake data
timestamps = [0,30,60]
valuesA = [{
0.1: 1,0.2: 2,0.3: 3},{
0.1: 4,0.2: 5,0.3: 6},{
0.1: 7,0.2: 8,0.3: 9}]
valuesB = [{
0.1: 1.5,0.2: 2.5,0.3: 3.5},{
0.1: 4.5,0.2: 5.5,0.3: 6.5},{
0.1: 7.5,0.2: 8.5,0.3: 9.5}]
A = pd.DataFrame(valuesA,index= [pd.Timestamp(t,unit='s') for t in timestamps])
B = pd.DataFrame(valuesB,unit='s') for t in timestamps])
# The actual DataFrame I'm working with
DATA = pd.concat([A,B],axis=1,keys=['A','B'],names=['Quantity','Position']).swaplevel(0,1,axis=1).sort_index(axis=1)
print(DATA)
打印输出如下:
Position 0.1 0.2 0.3
Quantity A B A B A B
1970-01-01 00:00:00 1 1.5 2 2.5 3 3.5
1970-01-01 00:00:30 4 4.5 5 5.5 6 6.5
1970-01-01 00:01:00 7 7.5 8 8.5 9 9.5
目标
如您所见,我的数据由两个索引组成:时间戳和位置。
我的目标是将其编写为一系列csv文件,每个时间戳一个文件,以及一个附加的时间戳/索引参考文件。
例如,csv文件如下所示:
out_1.csv
Position,A,B
0.1,1.5
0.2,2,2.5
0.3,3,3.5
out_2.csv
Position,4,4.5
0.2,5,5.5
0.3,6,6.5
out_3.csv
Position,7,7.5
0.2,8,8.5
0.3,9,9.5
out_times.csv
index,time
1,0
2,30
3,60
问题
构建时间戳/索引参考文件没有问题。
此外,我实现了如上例中但中那样仅使用非MultiIndex数据编写csv文件的功能。但是,我认为我使用的方法(转换DataFrame,在每一列上循环并使用to_csv方法)远不是最干净,最简单和整体最佳的解决方案。
不幸的是,我找不到使用MultiIndex数据的方法吗?
其他信息
最后,我知道数据生成示例远非漂亮,但这并未像我的代码中那样实现:) 我无法更改数据的写入方式,也无法更改生成的数据的形状(代码段中的 DATA )
最好,该代码将支持任意数量的“第二级列索引”(即,仅从 A 到 A , B , C ,... N )。但是第一级(位置和数量将永远不变)
也许使用dask可能是解决方案?我试图了解如何使用它,但到目前为止还没有运气...
谢谢您的帮助!
解决方法
您可以执行以下操作:
#this is given that the timestamp is in your index
p=DATA.T.reset_index().pivot(index='Position',columns='Quantity')
filename={}
count=0
for i in DATA.index:
p[i].to_csv("out_{}.csv".format(count))
filename[count]=[i]
count+=1
它将产生:
out_0.csv
out_1.csv
out_2.csv
使用所需的表单。
然后:
pd.DataFrame(filename).to_csv('out_times.csv')
保存文件和时间戳的映射