【问题标题】:Multi-files CSV writing with Pandas MultiIndex data使用 Pandas MultiIndex 数据写入多文件 CSV
【发布时间】:2020-12-31 02:58:42
【问题描述】:

上下文

我正在尝试使用 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 ,index= [pd.Timestamp(t, 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, 1.5
0.2, 2, 2.5
0.3, 3, 3.5

out_2.csv

Position, A, B
0.1, 4, 4.5
0.2, 5, 5.5
0.3, 6, 6.5

out_3.csv

Position, A, B
0.1, 7, 7.5
0.2, 8, 8.5
0.3, 9, 9.5

out_times.csv

index, time
1,0
2,30
3,60

问题

构建时间戳/索引参考文件没有问题。

另外,我实现了如上例中那样编写 csv 文件仅使用非 MultiIndex 数据。但是,我认为我使用的方法(转置 DataFrame、在每一列上循环并使用 to_csv 方法)远不是最干净、最简单和整体上最好的解决方案。

很遗憾,我找不到使用 MultiIndex 数据的方法?

其他信息

最后,我知道数据生成示例远非漂亮,但这并没有像我的代码中那样实现 :) 我无法更改数据的写入方式,也无法更改生成数据的形状(DATA 在我的代码 sn-p 中)

最好,该代码将支持任意数量的“二级列索引”(即仅从 AAB、C, ... N)。但是第一层(PositionQuantity永远不会改变)

也许使用 dask 可能是解决方案?我试图了解如何使用它,但到目前为止还没有运气......

感谢您的热心帮助!

【问题讨论】:

    标签: python pandas dataframe csv multi-index


    【解决方案1】:

    您可以执行以下操作:

    #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')
    

    保存文件的映射和时间戳

    【讨论】:

    • 它按预期完美运行,我只是将循环中的文件名字典更改为输出秒数而不是 out_times.csv 中的时间戳:filename[count]=[(i.to_numpy() - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')] 并转置文件名数据帧并禁用标题输出!谢谢,答案已验证(y)
    猜你喜欢
    • 2018-11-12
    • 2014-12-29
    • 2013-05-31
    • 2015-08-06
    • 2018-02-26
    • 2014-01-21
    • 2023-03-25
    相关资源
    最近更新 更多