如何向Pandas DataFrame添加表头行

282

我正在使用pandas将一个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添加标题行?


这是对您问题的不同解释:添加另一个标题到现有数据框以创建MultiIndex。 - cs95
7个回答

442

您可以直接在read_csv中使用names

names:类似数组,默认为无。要使用的列名称列表。如果文件没有标题行,则应显式传递header=None

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

201

或者您可以使用“header=None”读取您的csv文件,然后使用“df.columns”添加它:

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

1
代码很好 - 但我发现在一个空数据框上它不起作用。在这种情况下,Python会抛出“ValueError: Length mismatch: Expected axis has 0 elements, new values have ... elements”。你可能需要像https://dev59.com/YFcP5IYBdhLWcg3wXI3Z这样的东西。 - Alexandre Jean

28
col_Names=["Sequence", "Start", "End", "Coverage"]
my_CSV_File= pd.read_csv("yourCSVFile.csv",names=col_Names)

完成此操作后,只需使用以下命令进行检查:

my_CSV_File.head()

21

简单易行的解决方案:

import pandas as pd

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

注意:请确保您的标题长度与CSV文件的标题长度匹配。


我为你鼓掌,因为你是唯一一个实际回答问题而不是建议首先避免问题的人。 - KansaiRobot
1
我认为这个解决方案存在问题。在读取CSV文件后,第一行被声明为列。因此,当您使用“headers”列表重新声明列时,您并没有添加新行,而是用标题列表替换了第一行(已声明为标题)。因此,您最终会删除字面上的第一行数据。 - Reincoder

13
为了修复你的代码,你可以简单地将[Cov]更改为Cov.valuespd.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,并使用header=Nonenames=columns_list

当我们提供列列表时,是否可以为所选列添加默认值? - YoungSheldon

2

当读取没有标题的文件时,现有的答案正确地指出header=参数应设置为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=参数在一个函数调用中分配列名:

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

header=None 的方式通常更受欢迎,如果列数未知(因为 len(col_names) 必须等于从文件推断出的列数),或者特定的列名不重要。例如,在调用 read_csv 后调用 add_prefix() 可以向默认列名添加前缀:

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

0

由于提到我们正在从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接