Pandas DataFrame의 행을 열 헤더로 변환,


111

내가 작업해야하는 데이터는 약간 지저분합니다. 데이터 내부에 헤더 이름이 있습니다. 기존 pandas 데이터 프레임에서 행을 선택하고 열 머리글로 변경 (이름 변경)하려면 어떻게해야합니까?

다음과 같이하고 싶습니다.

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

두 번째 행 (인덱스 위치 1)의 값과 같도록 열 레이블을 설정합니다.

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

인덱스에 고유 한 레이블이있는 경우 다음을 사용하여 두 번째 행을 삭제할 수 있습니다.

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])하면 두 번째 행과 동일한 레이블이있는 모든 행이 제거 됩니다 . 고유하지 않은 인덱스는 이와 같은 걸림돌 (또는 잠재적 버그)로 이어질 수 있기 때문에 인덱스가 고유한지주의하는 것이 좋습니다 (Pandas에서 필요하지 않더라도).


빠른 답변에 감사드립니다! 색인 위치 대신 값으로 행을 선택하여 헤더로 만들 수 있습니까? 따라서 예를 들어 .. df.columns = df [df [0] == 'foo']
EK

문제는 값이있는 행이 둘 이상있을 수 있다는 것 "foo"입니다. 이 문제를 해결하는 한 가지 방법은 첫 번째 행을 명시 적으로 선택하는 것 df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]]입니다..
unutbu

아, 왜 그렇게했는지 알겠습니다. 제 경우에는 값이 "foo"인 행이 하나만 있다는 것을 알고 있습니다. 그래서 괜찮습니다. 방금 이렇게했는데 위에서 준 것과 같은 것 같아요. 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 솔루션을 좋아합니다.
Javier

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.