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)

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

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.