使用Pandas MultiIndex数据进行多文件CSV写入

问题描述

上下文

我正在尝试使用如下所示的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')

保存文件和时间戳的映射