我正在将 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 添加标题行的干净方法是什么?
您可以直接在
names
中使用
read_csv
names :类似数组,默认 None 要使用的列名称列表。如果文件 不包含标题行,那么您应该显式传递 header=None
Cov = pd.read_csv("path/to/file.txt",
sep='\t',
names=["Sequence", "Start", "End", "Coverage"])
或者,您可以使用
header=None
读取 csv,然后使用 df.columns
添加它:
Cov = pd.read_csv("path/to/file.txt", sep='\t', header=None)
Cov.columns = ["Sequence", "Start", "End", "Coverage"]
col_Names=["Sequence", "Start", "End", "Coverage"]
my_CSV_File= pd.read_csv("yourCSVFile.csv",names=col_Names)
完成此操作后,只需检查:
my_CSV_File.head()
简单易行的解决方案:
import pandas as pd
df = pd.read_csv("path/to/file.txt", sep='\t')
headers = ["Sequence", "Start", "End", "Coverage"]
df.columns = headers
注意: 确保您的标头长度和 CSV 文件标头长度不应不匹配。
要修复代码,您只需将
[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
。
当读取没有标题的文件时,现有答案正确地说
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
由于提到我们正在从 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