我正在读一个csv文件到熊猫。这个csv文件由四列和一些行组成,但是没有标题行,我想添加。我一直在尝试以下:

Cov = pd.read_csv("path/to/file.txt", sep='\t')
Frame = pd.DataFrame([Cov], columns = ["Sequence", "Start", "End", "Coverage"])
Frame.to_csv("path/to/file.txt", sep='\t')

但是当我应用代码时,我得到以下错误:

ValueError: Shape of passed values is (1, 1), indices imply (4, 1)

这个错误到底意味着什么?在python中添加标题行到我的csv文件/pandas df会是什么干净的方式?


当前回答

简单易行的解决方案:

import pandas as pd

df = pd.read_csv("path/to/file.txt", sep='\t')
headers =  ["Sequence", "Start", "End", "Coverage"]
df.columns = headers

注意:请确保您的头长度和CSV文件头长度不匹配。

其他回答

您可以直接在read_csv中使用名称

names:类数组,默认无要使用的列名列表。如果文件 不包含标题行,那么你应该显式地传递header=None

Cov = pd.read_csv("path/to/file.txt", 
                  sep='\t', 
                  names=["Sequence", "Start", "End", "Coverage"])

因为上面提到我们正在从csv文件中读取,所以分隔符应该是','[默认值,不需要提到]'并且给定的文件没有头文件,因此header=None '

示例代码:

import pandas as pd
data = pd.read_csv('path/to/file.txt',header=None)
data.columns = ["Sequence", "Start", "End", "Coverage"]
print(data.head()) #Print the first rows

当读取一个没有头文件时,现有的答案正确地说header= parameter应该设置为None,但没有解释为什么。这是因为默认情况下,header=0,这意味着文件的第一行被推断为头文件。例如,下面的代码用col_names覆盖第一行,因为第一行被读取为标头,它被col_names替换。

注意,这里假设列之间用空格' '分隔。

col_names = ["Sequence", "Start", "End", "Coverage"]
df = pd.read_csv("path/to/file.txt", sep=' ')                   # <--- wrong
df.columns = col_names

为了得到正确的输出,你需要设置header=None:

df = pd.read_csv("path/to/file.txt", sep=' ', header=None)      # <--- OK
df.columns = col_names

或者使用names= parameter在一次函数调用中为列名赋值:

df = pd.read_csv("path/to/file.txt", sep=' ', names=col_names)  # <--- OK

如果列数未知(因为len(col_names)等于从文件中推断出的列数非常重要),或者具体的列名不重要,则通常首选None方式。例如,在read_csv之后调用add_prefix()可以为默认列名添加前缀:

df = pd.read_csv("path/to/file.txt", sep=' ', header=None).add_prefix('col')

或者你也可以用header=None读取csv文件,然后用df.columns添加它:

Cov = pd.read_csv("path/to/file.txt", sep='\t', header=None)
Cov.columns = ["Sequence", "Start", "End", "Coverage"]

要修复你的代码,你可以简单地将[Cov]更改为Cov。Values, pd的第一个参数。DataFrame将变成一个多维numpy数组:

Cov = pd.read_csv("path/to/file.txt", sep='\t')
Frame=pd.DataFrame(Cov.values, columns = ["Sequence", "Start", "End", "Coverage"])
Frame.to_csv("path/to/file.txt", sep='\t')

但最聪明的解决方案仍然是使用pd。read_excel with header=None and names=columns_list。