web-dev-qa-db-ja.com

Pandas DataFrameの行を列ヘッダーに変換し、

使用しなければならないデータは少し複雑です。データ内にヘッダー名があります。既存のpandasデータフレームから行を選択し、列ヘッダーにする(名前を変更する)にはどうすればよいですか?

私は次のようなことをしたいです:

header = df[df['old_header_name1'] == 'new_header_name1']

df.columns = header
71
E.K.
In [21]: df = pd.DataFrame([(1,2,3), ('foo','bar','baz'), (4,5,6)])

In [22]: df
Out[22]: 
     0    1    2
0    1    2    3
1  foo  bar  baz
2    4    5    6

列ラベルを2行目の値(インデックス位置1)と等しくなるように設定します。

In [23]: df.columns = df.iloc[1]

2行目をドロップします。

In [24]: df.reindex(df.index.drop(1))
Out[24]: 
1 foo bar baz
0   1   2   3
2   4   5   6
130
unutbu

これは動作します(pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])
35
Zachary Wilson

データフレームを再作成する方が簡単です。これにより、列のタイプも最初から解釈されます。

headers = df.iloc[0]
new_df  = pd.DataFrame(df.values[1:], columns=headers)
3
shahar_m

read_csv または read_html コンストラクターで行インデックスを指定することができます header を表すパラメーター- Row number(s) to use as the column names, and the start of the data。これには、ジャンクであると思われる先行するすべての行が自動的に削除されるという利点があります。

import pandas as pd
from io import StringIO

In[1]
    csv = '''junk1, junk2, junk3, junk4, junk5
    junk1, junk2, junk3, junk4, junk5
    35, 40, 25, 19, 33
    40, 50, 61, 72, 85
'''

    df = pd.read_csv(StringIO(csv), header=2)
    print(df)

Out[1]
   35   40   25   19   33
0  40   50   61   72   85
1
ccpizza