web-dev-qa-db-ja.com

パンダDataFrameにヘッダ行を追加する方法

私はcsvファイルをpandasに読み込んでいます。このcsvファイルは4列といくつかの行で構成されていますが、追加したいヘッダー行がありません。私は次のことを試みてきました:

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)

正確にはエラーの意味は何ですか?そして私のcsvファイル/ pandas dfにヘッダ行を追加するためのpythonのクリーンな方法は何でしょうか?

111
sequence_hard

namesread_csv で直接使用できます。

names:array-like、デフォルトなし使用する列名のリスト。 fileにヘッダ行が含まれていない場合は、header = Noneを明示的に渡す必要があります。

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

下の行は期待通りには動きません。 Covはすでにデータフレームです。ファイルから読み取られるときに実際に4列あると仮定します。

Frame=pd.DataFrame([Cov], columns = ["Sequence", "Start", "End", "Coverage"])
165
Leb

あるいは、header=Noneでcsvを読み、df.columnsでそれを追加することもできます。

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

これを行ったら、それを確認してください。それでも...

my_CSV_File.head()

それが役立つことを願っています...乾杯

9
Bhardwaj Joshi

コードを修正するには、[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_Excelheader=Noneと一緒にnames=columns_listを使うことです。

5
romulomadu

ヘッダー行をpandas DataFrameに追加する方法は?

考慮すべき2つのケースがあります。

  1. DataFrameにヘッダーがない、または
  2. DataFrameには既にヘッダーがありますが、別のレベルを追加したいです

ヘッダーのないDataFrameがあり、このデータがCSVからのものではない場合は、単に.columns属性に割り当てます。

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

データがCSV/Excelからのものである場合は、names属性を文書化された here として使用できます。

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

既にヘッダーのあるDataFrameがあり、別のレベルをヘッダーに追加してMultiIndexを作成する場合は、次を使用できます。

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

   A  B
0  1  4
1  2  5
2  3  6
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を使用します(より簡単です)。

df.columns = pd.MultiIndex.from_product([['foo'], df.columns])
df

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

CSVに保存すると、各列の上に「foo」が表示されることに注意してください。

df.to_csv('file.csv', index=False)
!cat file.csv

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