【问题标题】:How to transpose a dataset in a csv file?如何在 csv 文件中转置数据集?
【发布时间】:2011-02-01 23:29:39
【问题描述】:

例如,我想改造:

Name,Time,Score
Dan,68,20
Suse,42,40
Tracy,50,38

进入:

Name,Dan,Suse,Tracy
Time,68,42,50
Score,20,40,38

编辑:原始问题错误地使用了“转置”一词。

【问题讨论】:

  • 你试过什么?这是作业吗?你为什么要把它从平常的东西变成奇怪的东西?
  • 哈哈。我希望我回到hw时代
  • 我个人认为这里的转置是不正确的。见en.wikipedia.org/wiki/Transpose
  • @chmullig:???矩阵转置正是 OP 想要的。 “枢轴”不是任何人都应该寻找的词。
  • @chmullig:看起来我错过了不正确的“in”……我通常不会被双重否定所困扰;我是写not not x而不是bool(x)的人:-)

标签: python csv transpose


【解决方案1】:

如果整个文件内容适合内存,您可以使用

import csv
from itertools import izip
a = izip(*csv.reader(open("input.csv", "rb")))
csv.writer(open("output.csv", "wb")).writerows(a)

您基本上可以将zip()izip() 视为转置操作:

a = [(1, 2, 3),
     (4, 5, 6),
     (7, 8, 9)]
zip(*a)
# [(1, 4, 7),
#  (2, 5, 8),
#  (3, 6, 9)]

izip() 避免立即复制数据,但基本上会这样做。

【讨论】:

  • 这很漂亮。不过,您可能会解释您在做什么,因为对于不熟悉 izip 和 python 可迭代对象的人来说,这可能并不直观。
  • 如果整个文件适合内存添加更多内存
  • +1。顺便说一句,看起来手册需要更新“如果语法 *expression 出现在函数调用中,则表达式必须计算为序列”...... csv.reader() 不会计算为序列。
  • @Tony: 在Python Tutorial.
  • @xApple:只要你所有的行都有相同数量的项目,这将起作用。如果你有不同列数的行,那么转置无论如何都是毫无意义的。
【解决方案2】:

input.csv 转移到output.csv。熊猫也可以提供帮助。

import pandas as pd
pd.read_csv('input.csv', header=None).T.to_csv('output.csv', header=False, index=False)

【讨论】:

  • 优秀的单行。
  • 拯救了这一天,@anton-tarasenko !我仍然想知道为什么csv.writerows(my_list) 不能做我需要的事情。相反,我必须做csv.writerow(my_list) 然后使用你的转置一行来让我的一行变成多行。疯了!
【解决方案3】:

nosklo 的相同答案(所有功劳归他所有),但对于 python3:

from csv import reader, writer 
with open('source.csv') as f, open('destination.csv', 'w') as fw: 
    writer(fw, delimiter=',').writerows(zip(*reader(f, delimiter=',')))

【讨论】:

  • 需要open(output_filename, 'w', newline='') as fw 或者是双倍行距。
【解决方案4】:
from itertools import izip
from csv import reader, writer

with open('source.csv') as f, open('destination.csv', 'w') as fw:
    writer(fw, delimiter=',').writerows(izip(*reader(f, delimiter=',')))

【讨论】:

  • -1 如果是 Python 2.x,应该对两个文件都使用二进制模式。如果是 Python 3.x,应该在两个文件上都使用 newline=''。另外:delimiter=',' 是默认值。
【解决方案5】:

如果lines 是您的原始文本列表,那么它应该是

for i in range(1,len(lines)):
    lines[i] = lines[i].split(',')

new_lines = []
for i in range(len(lines[0])):
    new_lines.append("%s,%s,%s" % (lines[0][i], lines[1][i], lines[2][i]))

或使用csv Python 模块 - http://docs.python.org/library/csv.html

【讨论】:

    【解决方案6】:

    最简单的方法是:

    import numpy as np
    import pandas as pd
    
    _mat = pd.read_csv("test.csv")
    _mat = _mat[_mat.columns[0:3]].values
    _t_mat = np.transpose(_mat)
    

    结果:

    • 输入矩阵为:[[1 2 3] [4 5 6]]
    • 输出为:[[1 4] [2 5] [3 6]]

    【讨论】:

      【解决方案7】:

      将 CSV 读入pandas 数据框,pandas 内置转置函数,调用如下。

      import pandas as pd
      
      csv = pd.read_csv("test.csv", skiprows=1)
      # use skiprows if you want to skip headers
      df_csv = pd.DataFrame(data=csv)
      transposed_csv = df_csv.T
      print(transposed_csv)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        相关资源
        最近更新 更多