팬더에서 하나의 열을 제외하고 모든 열을 선택하는 방법은 무엇입니까?


278

다음과 같은 데이터 프레임이 있습니다.

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

어떻게 제외하고 모든 열을 얻을 수 column b있습니까?


@ cs95-현재 나열된 중복 대상이 중복되지 않습니다. 원래 제목에도 불구하고 관련 질문은 "이 특정 구문이 작동하지 않는 이유"이며,이 질문은 더 일반적인 "이를 수행하는 가장 좋은 방법은 무엇입니까"입니다. -기존 DataFrame에서 열을 삭제하는 것과 다른 열의 열을 모두 사용하여 새 DataFrame을 만드는 것의 차이점을 추가하십시오.
RM

@RM 죄송합니다. 해당 게시물의 제목을 수정 한 내용에 동의하지 않으므로 롤백했습니다. OP의 의도가 구문에 의문을 제기하는 것이 사실이지만 게시물은 열을 삭제하는 방법에 대한보다 광범위한 질문을 해결하기 위해 커졌습니다. 이 게시물의 답변은 가장 높은 투표 게시물의 카본 사본입니다. 듀프는 유지됩니다.
cs95

이 질문은 Meta 에서 논의되고 있습니다.
Heretic Monkey

답변:


421

열이 다중 인덱스가 아닌 경우 df.columns열 이름의 배열 일 뿐이므로 다음을 수행 할 수 있습니다.

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127

13
나쁘지는 않지만 @mike의 솔루션을 사용하는 drop것이 더 나은 IMO입니다. 좀 더 읽기 쉽고 다중 인덱스를 처리
travc

5
실제로 @mike의 솔루션을 사용하는 drop것이 더 낫다는 것에 동의합니다. (단일 수준) 열은 작업 할 수있는 배열이지만 특히 열을 삭제하는 데 drop매우 읽기 쉽고 복잡한 색인과 잘 작동 한다는 것을 발견하는 것이 유용하다고 생각합니다 .
Marius

1
이 위대한 답변에 감사드립니다. 헤더가 없으면 어떻게합니까? 나는 어떻게 adrress?
FabioSpaghetti

1
무시할 열이 두 개 이상인 경우는 어떻습니까?
브루노 암 브로 지오

227

를 사용하지 마십시오 ix. 그것은 것 되지 않습니다 . 가장 읽기 쉽고 관용적 인 방법은 다음과 df.drop()같습니다.

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

기본적으로 .drop()제자리에서 작동하지 않습니다. 불길한 이름에도 불구 df하고이 과정은 무사합니다. 에서 영구적으로 제거하려면 b을 (를 df) 수행하십시오 df.drop('b', inplace=True).

df.drop()라벨 목록을 허용합니다 (예 : df.drop(['a', 'b'], axis=1)a및) b.


1
예상대로 멀티 인덱스에서도 작동합니다. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). 여러 열 (목록)을 원하는지 또는 다중 색인 (튜플)을 참조하는지 결정하기 위해 list vs tuple을 사용하는 것 같습니다.
travc

16
더 읽기 쉬운 : df.drop(columns='a')또는 df.drop(columns=['a', 'b']). 또한 대체 할 수 columns=와 함께 index=.
BallpointBen

그러나 삭제하려는 모든 열의 이름을 모르는 경우에는 유용 하지 않습니다 .
yeliabsalohcin

이렇게하면보기 / 참조가 아닌 사본이 작성되므로 할당의 LHS에서이를 사용하여 원본 데이터 프레임을 수정할 수 없습니다.
Jan Christoph Terasa

132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833

9
하나 이상의 열을 생략하는 데 사용할 수 있으므로이 방법이 마음에 듭니다.
Nischal Hp

3
@NischalHp df.drop은 둘 이상의 열을 생략 할 수도 있습니다. df.drop ([ 'a', 'b'], axis = 1)
Patrick Li

2
이것이 컬럼을 재정렬 할 수 있다는 점에 주목할 가치가 있다고 생각합니다.
ocean800

1
@ ocean800 그렇습니다. sort=False그 행동을 피하고 싶다면 통과 할 수 있습니다 ( df.columns.difference(['b'], sort=False))
ayhan

64

당신이 사용할 수있는 df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

다음과 같이 여러 열을 삭제하려는 경우 :

df.loc[:, ~df.columns.isin(['col1', 'col2'])]

12

다른 방법은 다음과 같습니다.

df[[i for i in list(df.columns) if i != '<your column>']]

원하지 않는 열을 제외하고 표시 할 모든 열을 전달하면됩니다.


5

@Salvador Dali를 약간 수정하면 열 목록에서 제외 할 수 있습니다.

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

또는

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

4

가장 좋은 방법은 @Salvador Dali가 언급 한 방법이라고 생각합니다. 다른 사람들이 잘못되었다는 것이 아닙니다.

하나의 열을 선택하고 비교 또는 계산 목적으로 하나의 변수에 나머지 열을 다른 변수에 넣으려는 데이터 세트가있는 경우. 그런 다음 데이터 세트의 열을 삭제하면 도움이되지 않을 수 있습니다. 물론 유스 케이스도 있습니다.

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

그런 다음 변수의 열 컬렉션 을 다른 계산 x_cols과 같은 다른 변수 에 넣을 수 있습니다 x_cols1.

ex: x_cols1 = data[x_cols]

이것이 왜 살바도르의 답변에 대한 주석 / 확장 대신 별도의 답변인지 설명 할 수 있습니까?

3

다음은 한 줄짜리 람다입니다.

df[map(lambda x :x not in ['b'], list(df.columns))]

전에 :

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

이후 :

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.