将pandas df以复杂的格式写入(csv)文件

时间:2017-03-09 03:11:59

标签: python csv pandas dataframe

我正在处理有6列的pandas dataFrame,我想将这些列写入文件,最好是.txt格式(但我使用的是df.to_csv方法,而不是使用.csv扩展名,所以它出现了是一个文本文件)。 以下是示例df

      a    b    c    d    e    f
    0 1    6    34   99   2    5
    1 9    8    89   56   33   77
    2 4    55   45   87   54   34

当我将此数据帧写入文件时,以下是我的期望:

    1  6  34
    99 2  5
    9  8  89
    56 33 77
    4  55 45
    87 54 34

正如我们所看到的,行的前三个和后三个值应该在文件的不同行中,用于df的所有行;没有标题和索引。

以下是我用来消除标题和索引的简单代码,但我不知道如何实现其余条件。我不能手动格式化输出文件,因为它是一个包含数千行的庞大数据帧。一旦我为一个df写了数据,我将不得不从另一个同样大的df(结构相同)中追加数据。

with open('output', 'a+') as f:
     df.to_csv(f, header = False, index = False, sep = " ")

或者我应该完全采用不同的方法,比如为任务定义一个函数?

1 个答案:

答案 0 :(得分:1)

首先,将平面列名称更改为两级层次结构名称:将新名称准备为元组列表,并从列表中创建新索引。

new_columns = [(a,b) for b in (0,1) for a in df.columns[:len(df.columns)/2]]
#[('a', 0), ('b', 0), ('c', 0), ('a', 1), ('b', 1), ('c', 1)]
df.columns = pd.MultiIndex.from_tuples(new_columns)
#df
#   a   b   c   a   b   c
#   0   0   0   1   1   1
#0  1   6  34  99   2   5
#1  9   8  89  56  33  77
#2  4  55  45  87  54  34

注意每列有两个名称,并重复名字。现在,堆叠数据帧:将第二列名称转换为行名称:

tall = df.stack()
#      a   b   c
#0 0   1   6  34
#  1  99   2   5
#1 0   9   8  89
#  1  56  33  77
#2 0   4  55  45
#  1  87  54  34

高大的数据框已准备好转到文件:

tall.to_csv(filename, header=False, index=False, sep=' ')
#1  6   34
#99 2   5
#9  8   89
#56 33  77
#4  55  45
#87 54  34