pandas DataFrame 열 헤더에서 목록 가져 오기


1013

팬더 DataFrame에서 열 헤더 목록을 가져 오려고합니다. DataFrame은 사용자 입력에서 제공되므로 열 수 또는 열이 무엇인지 알 수 없습니다.

예를 들어 다음과 같은 DataFrame이 제공된 경우 :

>>> my_dataframe
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

다음과 같은 목록을 원합니다.

>>> header_list
['y', 'gdp', 'cap']

답변:


1644

다음을 수행하여 값을 목록으로 얻을 수 있습니다.

list(my_dataframe.columns.values)

또한 간단하게 사용할 수 있습니다 : ( Ed Chum의 답변에 표시된 것처럼 ) :

list(my_dataframe)

42
이 문서columns 에 속성 이 없는 이유는 무엇 입니까?
— Tjorriemorrie

@Tjorriemorrie : 확실하지 않습니다. 자동으로 문서를 생성하는 방식과 관련이있을 수 있습니다. 그것은 비록 다른 곳에서 언급 한 : pandas.pydata.org/pandas-docs/stable/...
— 시므온 프랜트에게

8
나는 같은 것을 기대했을 것이다 df.column_names(). 이 답변이 여전히 옳거나 구식입니까?
— alvas

1
@alvas에는 여러 가지 다른 방법이 있지만 (이 페이지의 다른 답변 참조) 데이터 프레임에 직접 목록을 생성하는 방법이 없다는 것을 알고 있습니다.
— Simeon Visser

19
중요한 것은 열 순서를 유지합니다.
— WindChimes 2016 년

402

가장 성능이 좋은 내장 메소드가 있습니다.

my_dataframe.columns.values.tolist()

.columns인덱스를 .columns.values반환하고 배열 .tolist을 반환하며 목록을 반환하는 도우미 함수 가 있습니다.

성능이 중요하지 않은 경우 Index객체 .tolist()는 직접 호출 할 수 있는 메서드를 정의합니다 .

my_dataframe.columns.tolist()

성능의 차이는 분명합니다.

%timeit df.columns.tolist()
16.7 µs ± 317 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df.columns.values.tolist()
1.24 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

입력을 미워하는 사람들을 위해, 당신은 단지 호출 할 수 있습니다 list에 df이렇게 같이 :

list(df)

4
다운 투표하지 않았지만 설명하고 싶습니다 : 구현 세부 사항에 의존하지 말고 DataFrame의 "공개 인터페이스"를 사용하십시오. df.keys의 아름다움 ()에 대해 생각
— 샤샤 고트 프리트

3
@SaschaGottfried는 DataFrameiterable 의 구현이 첫날 이후 변경되지 않았습니다 : pandas.pydata.org/pandas-docs/stable/basics.html#iteration . DataFrame에서 반환 된 iterable은 항상 열이므로 for col in df:개발자가 붕괴 list(df)되고 유효한 방법 이 아닌 한 항상 동일한 방식으로 작동 해야합니다. 주 df.keys()열되는 키 복귀 딕셔너리 형 구조의 내부 구현에 호출된다. 설명 할 수없는
— 다운 보트

columns속성 의 구현 세부 사항을 참조하고있었습니다 . 한 시간 전에 나는 발신자가 내부 객체 모델 탐색에 의존해서는 안된다고 홍보하는 데메테르 법칙에 대해 읽었습니다. list(df)명시 적 유형 변환을 수행합니다. 주목할만한 부작용 : 데이터 프레임 크기 df.keys()방법으로 실행 시간 및 메모리 소비가 증가하는 것은 dict과 같은 특성입니다 DataFrame. 주목할만한 사실 : df.keys()팬더 개발자의 책임의 일부인 데이터 프레임 크기에 관계없이 실행 시간 이 다소 일정합니다.
— Sascha Gottfried

1
@SaschaGottfried 나는 이것을 내 답변에 추가 할 수 있으며 아무도 이것을 포함하지 않은 것으로 본 크레딧
— EdChum

1
주어진 답변과 의견에서 가치를 볼 수 있습니다-아무것도 변경할 필요가 없습니다.
— Sascha Gottfried

89

몇 가지 빠른 테스트를 수행했으며 놀랍게도 내장 버전 dataframe.columns.values.tolist()이 가장 빠릅니다.

In [1]: %timeit [column for column in df]
1000 loops, best of 3: 81.6 µs per loop

In [2]: %timeit df.columns.values.tolist()
10000 loops, best of 3: 16.1 µs per loop

In [3]: %timeit list(df)
10000 loops, best of 3: 44.9 µs per loop

In [4]: % timeit list(df.columns.values)
10000 loops, best of 3: 38.4 µs per loop

(나는 여전히 그래도 정말로 좋아 list(dataframe)하므로 EdChum에게 감사드립니다!)


47

그것의 더 간단 해집니다 (팬더 0.16.0으로) :

df.columns.tolist()

멋진 목록의 열 이름을 제공합니다.


37
>>> list(my_dataframe)
['y', 'gdp', 'cap']

디버거 모드에서 데이터 프레임의 열을 나열하려면 목록 이해를 사용하십시오.

>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']

그건 그렇고, 간단히 다음을 사용하여 정렬 된 목록을 얻을 수 있습니다 sorted.

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']

이겠습니까 list(df)만 자동 증가 dataframes와 작업은? 아니면 모든 데이터 프레임에서 작동합니까?
— alvas

2
모두를 위해 일해야합니다. 그러나 디버거에있을 때는 목록 이해를 사용해야합니다 [c for c in df].
— Alexander

25

나는 지금 까지이 게시물을 보지 못 했으므로 여기에 남겨 두겠습니다.

확장 가능한 반복적 압축 풀기 (python3.5 +) : [*df]및 친구

압축 풀기 일반화 (PEP 448) 가 Python 3.5에서 도입되었습니다. 따라서 다음 작업이 모두 가능합니다.

df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x 

당신이 원한다면 list....

[*df]
# ['A', 'B', 'C']

또는 당신이 원하는 경우 set,

{*df}
# {'A', 'B', 'C'}

또는 당신이 원하는 경우 tuple,

*df,  # Please note the trailing comma
# ('A', 'B', 'C')

또는 결과를 어딘가에 저장하려면

*cols, = df  # A wild comma appears, again
cols
# ['A', 'B', 'C']

... 커피를 타이핑 소리로 변환하는 사람이라면 커피를보다 효율적으로 소비합니다.)

추신 : 성능이 중요하다면 위의 솔루션을 선호하여 위의 솔루션을 제거하고 싶을 것입니다

df.columns.to_numpy().tolist()
# ['A', 'B', 'C']

이 유사하다 에드 미끼의 대답 하지만 v0.24 업데이트 .to_numpy()를 사용하는 것이 바람직하다 .values. 자세한 내용은 이 답변 을 참조하십시오.

육안 검사
다른 답변에서 논의 된 것을 보았으므로 반복 가능한 포장 풀기를 사용할 수 있습니다 (명시 적 루프 필요 없음).

print(*df)
A B C

print(*df, sep='\n')
A
B
C

다른 방법의 비판

for한 줄로 수행 할 수있는 작업에 명시 적 루프를 사용하지 마십시오 (목록 이해는 괜찮습니다).

다음을 사용 하면 열의 sorted(df) 원래 순서 가 유지되지 않습니다 . 이를 위해서는 list(df)대신 사용해야 합니다.

다음으로, list(df.columns)그리고 list(df.columns.values)(현재 버전의 같은, v0.24) 나쁨 제안합니다. 두 Index(에서 반환 df.columns) 및 (에 의해 반환 NumPy와 어레이 df.columns.values)를 정의 .tolist()더 빠르고 더 관용적 인 방법.

마지막으로, 목록 화, 즉 list(df)확장 언 패킹이 불가능한 python <= 3.4에 대한 앞서 언급 한 방법에 대한 간결한 대안으로 만 사용해야합니다.



18

흥미롭지 만 df.columns.values.tolist()거의 3 배 더 빠르지 df.columns.tolist()만 나는 그것들이 같다고 생각했습니다.

In [97]: %timeit df.columns.values.tolist()
100000 loops, best of 3: 2.97 µs per loop

In [98]: %timeit df.columns.tolist()
10000 loops, best of 3: 9.67 µs per loop

2
이 답변 에서 이미 타이밍을 다뤘습니다 . 불일치의 이유 .values는 기본 numpy 배열을 반환하고 numpy로 무언가를 수행하는 것이 팬더로 직접 동일한 작업을 수행하는 것보다 거의 항상 빠르기 때문입니다.
— cs95

17

DataFrame는 DICT 같은 오브젝트의 "키"를 통해 반복의 규칙을 따른다.

my_dataframe.keys()

키 / 열 목록 만들기-객체 방법 to_list()및 pythonic 방식

my_dataframe.keys().to_list()
list(my_dataframe.keys())

DataFrame의 기본 반복 은 열 레이블을 반환합니다.

[column for column in my_dataframe]

열 레이블을 얻기 위해 DataFrame을 목록으로 변환하지 마십시오. 편리한 코드 샘플을 찾는 동안 생각을 멈추지 마십시오.

xlarge = pd.DataFrame(np.arange(100000000).reshape(10000,10000))
list(xlarge) #compute time and memory consumption depend on dataframe size - O(N)
list(xlarge.keys()) #constant time operation - O(1)

2
내 테스트는 df.columns보다 훨씬 빠릅니다 df.keys(). 왜 그들이 같은 것에 대해 함수와 속성을 모두 가지고 있는지 잘 모르겠습니다 (팬더에서 무언가를하는 10 가지 방법을 처음 본 것은 아닙니다).
— cs95

1
내 대답의 목적은 DataFrame에서 열 레이블을 쿼리하고 성능 안티 패턴을 강조 표시하는 몇 가지 방법을 보여주었습니다. 그럼에도 불구하고 나는 당신의 의견을 좋아하고 최근 답변을 찬성했습니다. 왜냐하면 그것들은 소프트웨어 엔지니어링 관점에서 가치를 제공하기 때문입니다.
— Sascha Gottfried

14

노트북에서

IPython 노트북의 데이터 탐색을 위해 내가 선호하는 방법은 다음과 같습니다.

sorted(df)

알파벳순으로 정렬 된 목록을 쉽게 읽을 수 있습니다.

코드 저장소에서

코드에서 수행하는 것이 더 명확하다는 것을 알았습니다.

df.columns

다른 사람들에게 코드를 읽는 것을 지시하기 때문입니다.


sorted(df)순서를 변경합니다. 주의해서 사용하십시오.
— cs95

@coldspeed "알파벳순으로 정렬 된 목록을 쉽게 읽을 수 있습니다."
— firelynx

9
%%timeit
final_df.columns.values.tolist()
948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
list(final_df.columns)
14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.columns.values)
1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
final_df.columns.tolist()
12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.head(1).columns)
163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

3

Simeon Visser의 답변에 따르면 ... 당신은 할 수 있습니다

list(my_dataframe.columns.values) 

또는

list(my_dataframe) # for less typing.

그러나 가장 달콤한 점은 다음과 같습니다.

list(my_dataframe.columns)

불필요하게 길지 않은 동시에 명시 적입니다.


"불필요하게 오래 걸리지 않는 것은 명백하다." 동의하지 않습니다. 호출은 list당신이 그것을 호출하지 않는 한 장점이 없다 df(간결성, 예를 들어, 위해) 직접. .columns속성에 액세스하면 메소드가 정의되어 있고를 호출하는 것보다 관용적 인 Index객체를 반환 tolist()합니다 Index. 완전성을 위해 관용구를 혼합하는 것은 좋은 생각이 아닙니다. 에서 얻은 배열을 나열하는 것도 마찬가지입니다 .values.
— cs95

3

빠르고 깔끔하고 육안으로 확인하려면 다음을 시도하십시오.

for col in df.columns:
    print col

3

이것은리스트에서 열의 이름을 알려줍니다 :

list(my_dataframe.columns)

tolist ()라는 다른 함수도 사용할 수 있습니다.

my_dataframe.columns.tolist()

이것은 이미 다른 답변에서 다루어졌습니다. 첫 번째 솔루션은 관용구도 혼합하므로 좋은 생각이 아닙니다. 다른 답변 아래 내 의견을 참조하십시오 .
— cs95

2

질문에 추가 설명이 필요하다고 생각합니다.

@fixxxer가 지적했듯이 대답은 프로젝트에서 사용하는 팬더 버전에 따라 다릅니다. pd.__version__명령으로 얻을 수 있습니다 .

0.16.0보다 오래된 팬더 버전을 사용하는 나와 같은 이유로 (debian jessie에서 0.14.1을 사용하는 경우) 다음을 사용해야합니다.

df.keys().tolist()df.columns아직 구현 된 메소드 가 없기 때문입니다 .

이 키 방법의 장점은 최신 버전의 팬더에서도 작동하므로 더 보편적입니다.


keys ()의 단점은 속성 조회가 아니라 함수 호출이므로 항상 느려질 것입니다. 물론, 지속적인 시간 액세스를 통해 아무도 이와 같은 차이점에 관심이 없지만 어쨌든 언급 할 가치가 있다고 생각합니다. df.columns는 이제 헤더에 액세스하는 데 더 보편적으로 사용되는 관용구입니다.
— cs95

1
n = []
for i in my_dataframe.columns:
    n.append(i)
print n

6
목록 이해력으로 교체하십시오.
— Sascha Gottfried

4
당신의 처음 세 행을 변경[n for n in dataframe.columns]
— 안톤 Protopopov

한 줄로 쉽게 할 수있는 작업으로이 모든 문제를 해결하고 싶은 이유는 무엇입니까?
— cs95

0

위에 제공된 솔루션은 훌륭하지만. 또한 frame.column_names ()와 같은 것이 팬더의 함수 일 것으로 기대하지만 그렇지 않기 때문에 다음 구문을 사용하는 것이 좋습니다. "tolist"함수를 호출하여 적절한 방법으로 팬더를 사용하고 있다는 느낌을 유지합니다. frame.columns.tolist ()

frame.columns.tolist() 

0

DataFrame에 Index 또는 MultiIndex가 있고 열 이름으로 포함하려는 경우 :

names = list(filter(None, df.index.names + df.columns.values.tolist()))

이러한 간단한 작업에 불필요한 성능 저하가있는 reset_index () 호출을 피합니다.

데이터 프레임 인덱스가 기본 / 고유 키에 매핑되는 데이터베이스에서 데이터를 가져오고 있지만 실제로는 또 다른 "열"이기 때문에 더 자주 필요합니다. 팬더가 이와 같은 것을 위해 내장 된 방법을 가지고있는 것이 아마도 합리적 일 것입니다.


-1

이 솔루션은 객체 my_dataframe의 모든 열을 나열합니다.

print(list(my_dataframe))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.