如何向 pandas DataFrame 添加标题行

问题描述 投票:0回答:7

我正在将 csv 文件读入 pandas。该 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 添加标题行的干净方法是什么?

python pandas dataframe csv header
7个回答
437
投票

您可以直接在

names
 
中使用
read_csv

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

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

198
投票

或者,您可以使用

header=None
读取 csv,然后使用
df.columns
添加它:

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

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 文件标头长度不应不匹配。


13
投票

要修复代码,您只需将

[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
header=None
names=columns_list


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)
等于从文件推断的列数,否则只有最后一列将被读取为列,并且所有列都将被读取)前面的行将被读取为索引级别)或者如果特定的列名称不重要。例如,在
add_prefix()
之后调用
read_csv
可以为默认列名添加前缀:

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

另一方面,如果 文件有标题,即文件中的第一行应被读取为列标签,则传递

names=
会将第一行推送为数据帧中的第一行。在这种情况下,如果您想在
pd.read_csv
调用期间设置列标签,请传递
header=0

import io
data = """
ab,bc
10,2.
"""

df = pd.read_csv(io.StringIO(data), names=['a', 'b'])           # <--- wrong
df = pd.read_csv(io.StringIO(data), names=['a', 'b'], header=0) # <--- OK

0
投票

由于提到我们正在从 csv 中读取,因此分隔符应该是

','[as default, not need to mention]' and the given file has no header so 
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
© www.soinside.com 2019 - 2024. All rights reserved.