我正在读一个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会是什么干净的方式?
要修复你的代码,你可以简单地将[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。
当读取一个没有头文件时,现有的答案正确地说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')