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


111

私が操作しなければならないデータは少し厄介です。データの中にヘッダー名があります。既存のパンダデータフレームから行を選択して列ヘッダーにする(名前を変更する)にはどうすればよいですか?

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

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

df.columns = header

回答:


196
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.drop(df.index[1])
Out[24]: 
1 foo bar baz
0   1   2   3
2   4   5   6

インデックスが一意でない場合は、以下を使用できます。

In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]: 
1 foo bar baz
0   1   2   3
2   4   5   6

を使用df.drop(df.index[1])すると、2番目の行と同じラベルを持つすべての行が削除されます。一意でないインデックスは、このような障害(または潜在的なバグ)につながる可能性があるため、インデックスが一意であるように注意することをお勧めします(Pandasはインデックスを必要としません)。


迅速な対応ありがとうございました!インデックスの場所の代わりに値で行を選択してヘッダーにする方法を教えてください。だからあなたの例のようなものです。df.columns = df [df [0] == 'foo']
EK

その問題は、値を持つ行が複数存在する可能性があることです"foo"。この問題を回避する1つの方法は、そのような最初の行を明示的に選択することですdf.columns = df.iloc[np.where(df[0] == 'foo')[0][0]]
unutbu 2014年

ああ、どうしてあなたがそのようにしたのかわかります。私の場合、「foo」という値を持つ行が1つだけあることを知っています。だから大丈夫です。私はちょうどあなたが私に上で与えたものと同じだと思うように私はこのようにやっただけです。idx_loc = df [df [0] == 'foo']。index.tolist()[0] df.columns = df.iloc [idx_loc]
EK

63

これは機能します(pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])

22
追加することで「ヘッダー」行を削除できます.drop(df.index[0])
ostrokach

私はこれが実際に受け入れられた答えよりも好きです。私は短いonelineソリューションが大好きです。
ハビエル

13

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

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

4

を表すパラメータを介して、read_csvまたはread_htmlコンストラクタで行インデックスを指定できます。これには、おそらくジャンクである先行するすべての行を自動的にドロップするという利点があります。headerRow 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
    pears, apples, lemons, plums, other
    40, 50, 61, 72, 85
    '''

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

Out[1]
       pears   apples   lemons   plums   other
    0     40       50       61      72      85
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.