关于python:如何将标题行添加到pandas DataFrame中

How to add header row to a pandas DataFrame

我正在把一个csv文件读到pandas中。这个csv文件包含四列和一些行,但没有标题行,我想添加。我一直在尝试以下方法:

1
2
3
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')

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

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

这个错误到底是什么意思?在python中,将头行添加到csv文件/pandas df中是一种干净的方法吗?


您可以直接在read_csv中使用names

names : array-like, default None List of column names to use. If file
contains no header row, then you should explicitly pass header=None

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


或者,您可以使用header=None读取csv,然后将其添加到df.columns中:

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


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

做了这件事,你只要检查一下[很明显我知道,你知道。但仍然……

1
my_CSV_File.head()

希望有帮助…干杯


要修复代码,只需将[Cov]更改为Cov.valuespd.DataFrame的第一个参数将成为多维numpy数组:

1
2
3
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_excelheader=Nonenames=columns_list结合使用。


How to add header row to a pandas DataFrame?

有两种情况需要考虑:

  • 数据帧没有标题,或者
  • 数据帧已经有一个头,但您要向其添加另一个级别
  • 如果您有一个没有标题的数据帧,并且该数据不是来自csv,只需将其分配给.columns属性:

    1
    df.columns = ['x', 'y', 'z']

    如果数据来自csv/excel,您可以使用这里记录的names属性。

    1
    df = pd.read_csv('file.csv', header=None, names=['x', 'y', 'z'])

    如果您已经有了一个数据帧,并且准备在数据帧的头上附加另一个级别来创建一个MultiIndex,那么您可以使用,

    1
    2
    3
    4
    5
    6
    7
    8
    # Setup
    df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
    df

       A  B
    0  1  4
    1  2  5
    2  3  6
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    new_level = ['C', 'D']
    df.columns = [new_level, df.columns]
    # Similar to,
    # df.columns = pd.MultiIndex.from_arrays([new_level, df.columns])

    df

       C  D
       A  B
    0  1  4
    1  2  5
    2  3  6

    df.columns
    MultiIndex(levels=[['C', 'D'], ['A', 'B']],
               codes=[[0, 1], [0, 1]])

    或者,如果要添加单个头段(例如"foo"),请使用from_product(更简单):

    1
    2
    3
    4
    5
    6
    7
    8
    df.columns = pd.MultiIndex.from_product([['foo'], df.columns])
    df

      foo  
        A  B
    0   1  4
    1   2  5
    2   3  6

    请注意,当您保存到csv时,它将在每列上方显示"foo":

    1
    2
    3
    4
    5
    6
    7
    8
    df.to_csv('file.csv', index=False)
    !cat file.csv

    foo,foo
    A,B
    1,4
    2,5
    3,6