【问题标题】:Writing pandas df to a (csv) file in a complicated format以复杂的格式将 pandas df 写入(csv)文件
【发布时间】:2017-03-09 03:11:58
【问题描述】:

我正在处理一个有 6 列的 pandas 数据帧,我想将这些列写入一个文件,最好是 .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 = " ")

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

【问题讨论】:

标签: python csv pandas dataframe


【解决方案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

【讨论】:

  • 我想知道 OP 是否更喜欢将数据框作为固定宽度文件,如 np.savetxt('output.txt', tall.values, fmt='%d')
  • 您好,我尝试了您建议的代码,但在执行第一部分(堆叠之前)后出现 TypeError。确切的错误是 'TypeError: cannot perform truediv with this index type:
  • 抱歉,右括号放错地方了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2013-05-31
相关资源
最近更新 更多