팬더 DataFrame에서 열 삭제


1326

DataFrame에서 열을 삭제할 때 다음을 사용합니다.

del df['column_name']

그리고 이것은 훌륭하게 작동합니다. 왜 다음을 사용할 수 없습니까?

del df.column_name

로 열 / 시리즈에 액세스 할 수 있기 때문에 이것이 df.column_name작동 할 것으로 예상했습니다.


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

답변:


858

짐작했듯이 올바른 구문은

del df['column_name']

del df.column_name파이썬의 구문상의 한계로 인해 간단 하게 작업 하기가 어렵습니다 . 파이썬에 의해 표지 아래로 del df[name]번역됩니다 df.__delitem__(name).


25
나는 이것이 매우 오래된 "답변"이라는 것을 알고 있지만 호기심은 까다 롭습니다. 파이썬의 구문 제한이 있습니까? class A(object): def __init__(self): self.var = 1수업을 시작한 다음 a = A(); del a.var잘 작동합니다.
dwanderson

13
@dwanderson의 차이점은 열을 제거 할 때 DataFrame에는 "방법"에 대한 자체 처리가 필요하다는 것입니다. 의 경우 DataFrame이 구현하고 필요에 따라 수정할 수있는 메소드로 del df[name]변환됩니다 df.__delitem__(name). 의 경우 del df.name멤버 변수가 사용자 지정 코드를 실행할 가능성없이 제거됩니다. 자신의 예를 고려하십시오- del a.var"삭제 변수"를 인쇄 할 수 있습니까? 가능하다면 방법을 알려주십시오. 난 못해 :)
Yonatan

8
@Yonatan docs.python.org/3/reference/datamodel.html#object.__delattr__ 또는 그에 대한 설명자를 사용할 수 있습니다 . docs.python.org/3/howto/descriptor.html
Eugene

5
@Yonatan Eugene의 의견은 Python 2에도 적용됩니다. 디스크립터는 2.2 이후 파이썬 2에서 사용되어 왔으며 요구 사항을 충족시키는 것은 쉽지 않습니다.)
CS

1
이 답변은 실제로 정확 하지 않습니다 . pandas개발자 는 그렇지 않았지만 그렇다고해서 어려운 것은 아닙니다.
wizzwizz4

2182

팬더에서 이것을 수행하는 가장 좋은 방법은 다음을 사용하는 것입니다 drop.

df = df.drop('column_name', 1)

번호 1는 어디에 있습니까 ( 행과 열의 경우).01

재할 당하지 않고 열을 삭제하려면 df다음을 수행하십시오.

df.drop('column_name', axis=1, inplace=True)

마지막으로 column label 대신 열 번호 를 기준 으로 삭제하려면 첫 번째, 두 번째 및 네 번째 열과 같이 삭제하십시오.

df = df.drop(df.columns[[0, 1, 3]], axis=1)  # df.columns is zero-based pd.Index 

열에 대한 "텍스트"구문으로 작업하기 :

df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True)

79
del어떤 이유로 이것이 권장 됩니까?
beardc

20
이 삭제 방법에는 장점이 있지만이 답변은 실제로 질문에 대한 답변을 제공하지는 않습니다.
Paul

109
사실 @Paul이지만 질문의 제목으로 인해 여기에 도착하는 대부분의 사람들은 열을 삭제하는 방법을 시도하여 그렇게합니다.
LondonRob

24
@beardc의 다른 장점 drop오버 deldrop만약 (특히, 3-D 행렬 유용하거나 축을 따라 동작 인플레 이스의 여부, 또한 삭제 기록을 한 번에 여러 개의 열을 떨어 수행 할 수 Panel)
호브

8
dropover의 또 다른 장점은 drop 이 pandas API의 일부이며 문서를 포함 del한다는 것 입니다.
modulitos

240

사용하다:

columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)

하나 이상의 열이 제자리에서 삭제됩니다. 참고 inplace=True팬더 추가되었다 V0.13 및 이전 버전에서 작동하지 않습니다. 이 경우 결과를 다시 할당해야합니다.

df = df.drop(columns, axis=1)

3
이 답변에 대한 참고 사항 : '목록'을 사용하는 경우 대괄호를 제거해야합니다.df.drop(list,inplace=True,axis=1)
edesz

1
이 방법의 우월성을 분명히하기 때문에 실제로 받아 들일만한 대답이어야합니다 del. 한 번에 두 개 이상의 열을 삭제할 수 있습니다.
dbliss

111

인덱스로 삭제

첫 번째, 두 번째 및 네 번째 열을 삭제하십시오.

df.drop(df.columns[[0,1,3]], axis=1, inplace=True)

첫 번째 열을 삭제하십시오.

df.drop(df.columns[[0]], axis=1, inplace=True)

inplace사본을 만들지 않고 원본 데이터를 수정할 수 있도록 선택적 매개 변수 가 있습니다.

터지는

열 선택, 추가, 삭제

열 삭제 column-name:

df.pop('column-name')

예 :

df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])

print df:

   one  two  three
A    1    2      3
B    4    5      6
C    7    8      9

df.drop(df.columns[[0]], axis=1, inplace=True) print df:

   two  three
A    2      3
B    5      6
C    8      9

three = df.pop('three') print df:

   two
A    2
B    5
C    8

1
팬더에서 어떻게 줄을 열 수 있습니까?
Kennet Celeste

2
@Yugi이를 위해 조옮김 데이터 프레임을 사용할 수 있습니다. 전 - df.T.pop('A')
시계 슬레이브

@ClockSlave 원본을 수정하지 않습니다 df. 당신 은 할df = df.T; df.pop(index); df = df.T있지만 이것은 과도한 것 같습니다.
cs95

대신 df.drop(df.columns[[0]], axis=1, inplace=True)사용하기에 충분하지 df.drop([0], axis=1)않습니까?
Anirban Mukherjee

1
@ Anirban Mukherjee 그것은 달려 있습니다. 희망 삭제 열 이름 경우 0, 다음 df.drop(0, axis=1)잘 작동. 그러나 열 이름을 모르고 첫 번째 열을 제거한 다음 필요 df.drop(df.columns[[0]], axis=1, inplace=True)하면 위치별로 첫 번째 열을 선택하고 삭제하십시오.
jezrael

71

여기에 대부분의 대답으로 놓친 실제 질문은 다음과 같습니다.

왜 사용할 수 del df.column_name없습니까?

처음에는 문제를 이해해야하는데,이를 위해서는 파이썬 매직 메소드 를 사용해야 합니다 .

Wes가 그의 답변에서 지적한 것처럼 열을 떨어 뜨리기 위해 팬더에서 구현 되는 del df['column']python magic 방법에 매핑 됩니다.df.__delitem__('column')

그러나 파이썬 매직 메소드 에 대한 위의 링크에서 지적했듯이 :

사실, __del__그것이 불리한 불안정한 환경 때문에 거의 사용해서는 안됩니다. 조심해서 사용하십시오!

del df['column_name']사용하거나 장려해서는 안된다고 주장 할 수 있으며 따라서 del df.column_name고려해서는 안됩니다.

그러나 이론적으로 magic 방법을del df.column_name 사용 하여__delattr__ 팬더에서 작동하도록 구현할 수 있습니다 . 그러나 이것은 특정 문제, del df['column_name']구현에 이미 있지만 적은 정도의 문제를 유발합니다 .

예제 문제

"dtypes"또는 "columns"라는 데이터 프레임에 열을 정의하면 어떻게됩니까?

그런 다음이 열을 삭제한다고 가정합니다.

del df.dtypes__delattr__"dtypes"속성 또는 "dtypes"열을 삭제해야하는 것처럼 메소드를 혼란스럽게 만듭니다 .

이 문제 뒤에 건축 질문

  1. 데이터 프레임은 모음 입니까?
  2. 데이터 프레임은 의 모음 입니까?
  3. 열 이 데이터 프레임 의 속성 입니까?

팬더 답변 :

  1. 예, 모든면에서
  2. 아니요, 그러나 원하는 경우 .ix, .loc또는 .iloc메소드를 사용할 수 있습니다 .
  3. 아마도 데이터 를 읽고 싶 습니까? 그리고 , 하지 않는 속성의 이름은 이미 dataframe에 속하는 다른 속성에 의해 취해진 다. 데이터 를 수정 하시겠습니까? 그리고 .

TLDR;

del df.column_name팬더는 이러한 종류의 인지 불협화음 이 사용자에게 발생하지 않도록 다시 생각 해야하는 상당히 자라 난 아키텍처를 가지고 있기 때문에 할 수 없습니다 .

팁 :

df.column_name을 사용하지 마십시오. 예쁘지 만인지 부조화를 유발합니다.

여기에 맞는 Zen of Python 인용문 :

열을 삭제하는 방법에는 여러 가지가 있습니다.

그것을하는 명백한 방법이 있어야합니다.

열은 때때로 속성이지만 때로는 그렇지 않습니다.

특별한 경우는 규칙을 어길만큼 특별하지 않습니다.

del df.dtypesdtypes 속성 또는 dtypes 열을 삭제 합니까 ?

모호함에 직면하여 추측하려는 유혹을 거부하십시오.


"사실, __del__불확실한 상황 때문에 사용해서는 안됩니다.주의해서 사용하십시오!" 여기서 사용되는 방법은이므로 여기와 완전히 관련이 없습니다 __delattr__.
pppery

1
@ppperry 당신은 그리워 인용입니다. 그것은의 del의미 내장이 아닌 .__del__인스턴스 메소드. del내부 명령에 매핑 __delattr__하고 __delitem__나는 내 주장을 구축하고있는 무슨이다. 아마 내가 쓴 것을 다시 읽고 싶을 것입니다.
firelynx

1
__... __StackExchange에 의해 대담한 마크 업으로 해석됩니다
pppery

2
"df.column_name을 사용하지 마십시오. 예쁘지 만인지 부조화를 유발합니다."이것은 무엇을 의미합니까? 나는 심리학자가 아니므로 당신이 무엇을 의미하는지 이해하기 위해 이것을 찾아야합니다. 또한 팬더에서 똑같은 일을하는 수백 가지의 유효한 방법이 있기 때문에 선을 인용하는 것은 의미가 없습니다.
cs95

58

추가 된 항목은 열이있는 경우에만 열삭제 하는 기능 입니다. 이 방법으로 더 많은 사용 사례를 처리 할 수 ​​있으며 전달 된 레이블에서 기존 열만 삭제합니다.

예를 들어 errors = 'ignore'를 추가하십시오 .

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')

41

버전 0.16.1부터는 할 수 있습니다

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')

3
그리고 이것은 여러 응용 프로그램을 삭제하는 것을 지원합니다. 일부 응용 프로그램이 필요한 경우 일부 열은 존재하지 않아도됩니다 (즉 오류가 발생하지 않음 errors= 'ignore') df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')!
muon

31

항상 []표기법을 사용하는 것이 좋습니다 . 한 가지 이유는 df.column_name숫자 표기법에 대해 속성 표기법 ( )이 작동하지 않기 때문입니다 .

In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]])

In [2]: df[1]
Out[2]:
0    2
1    5
Name: 1

In [3]: df.1
  File "<ipython-input-3-e4803c0d1066>", line 1
    df.1
       ^
SyntaxError: invalid syntax

26

팬더 0.21+ 답변

Pandas 버전 0.21은 및 메소드 의 서명과 일치하도록 및 매개 변수를 drop모두 포함 하도록 메소드를 약간 변경했습니다 .indexcolumnsrenamereindex

df.drop(columns=['column_a', 'column_c'])

개인적으로 axis매개 변수를 사용하여 열이나 인덱스를 나타내는 것이 거의 모든 팬더 방법에 사용되는 주요 키워드 매개 변수이기 때문에 선호 합니다. 그러나 이제 0.21 버전에서 몇 가지 선택 사항이 추가되었습니다.


1
df.drop ([ 'column_a', 'column_c'], 축 = 1) | 그것은 지금 나를 위해 일하고있다
YouAreAwesome

21

pandas 0.16.1 이상에서는 @eiTanLaVi가 게시 한 솔루션 당 열이있는 경우에만 열을 삭제할 수 있습니다. 해당 버전 이전에는 조건부 목록 이해를 통해 동일한 결과를 얻을 수 있습니다.

df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], 
        axis=1, inplace=True)

14

TL; DR

좀 더 효율적인 솔루션을 찾기위한 많은 노력. 단순성을 희생하면서 추가 된 복잡성을 정당화하기 어려움df.drop(dlst, 1, errors='ignore')

df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1)

프리앰블
열 삭제는 다른 열을 선택하는 것과 의미 상 동일합니다. 고려해야 할 몇 가지 추가 방법을 보여 드리겠습니다.

또한 한 번에 여러 열을 삭제하고 존재하지 않는 열을 삭제하려는 일반적인 솔루션에 중점을 둘 것입니다.

이러한 솔루션을 사용하는 것이 일반적이며 간단한 경우에도 효과적입니다.


설정 삭제 목록 및
고려pd.DataFrame dfdlst

df = pd.DataFrame(dict(zip('ABCDEFGHIJ', range(1, 11))), range(3))
dlst = list('HIJKLM')

df

   A  B  C  D  E  F  G  H  I   J
0  1  2  3  4  5  6  7  8  9  10
1  1  2  3  4  5  6  7  8  9  10
2  1  2  3  4  5  6  7  8  9  10

dlst

['H', 'I', 'J', 'K', 'L', 'M']

결과는 다음과 같아야합니다.

df.drop(dlst, 1, errors='ignore')

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

열을 삭제하여 다른 열을 선택하는 것과 동일하므로 두 가지 유형으로 나눕니다.

  1. 라벨 선택
  2. 부울 선택

라벨 선택

우리는 유지하려는 열을 나타내며 삭제하려는 열이없는 레이블 목록 / 배열을 제조하는 것으로 시작합니다.

  1. df.columns.difference(dlst)

    Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
  2. np.setdiff1d(df.columns.values, dlst)

    array(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype=object)
  3. df.columns.drop(dlst, errors='ignore')

    Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
  4. list(set(df.columns.values.tolist()).difference(dlst))

    # does not preserve order
    ['E', 'D', 'B', 'F', 'G', 'A', 'C']
  5. [x for x in df.columns.values.tolist() if x not in dlst]

    ['A', 'B', 'C', 'D', 'E', 'F', 'G']

레이블의 열
선택 프로세스를 비교하기 위해 다음을 가정하십시오.

 cols = [x for x in df.columns.values.tolist() if x not in dlst]

그런 다음 평가할 수 있습니다

  1. df.loc[:, cols]
  2. df[cols]
  3. df.reindex(columns=cols)
  4. df.reindex_axis(cols, 1)

모두 다음으로 평가됩니다.

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

부울 슬라이스

슬라이싱을위한 배열 / 부울리스트를 생성 할 수 있습니다

  1. ~df.columns.isin(dlst)
  2. ~np.in1d(df.columns.values, dlst)
  3. [x not in dlst for x in df.columns.values.tolist()]
  4. (df.columns.values[:, None] != dlst).all(1)

부울에서 열
비교를 위해

bools = [x not in dlst for x in df.columns.values.tolist()]
  1. df.loc[: bools]

모두 다음으로 평가됩니다.

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

견고한 타이밍

기능

setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst)
difference = lambda df, dlst: df.columns.difference(dlst)
columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore')
setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst))
comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst]

loc = lambda df, cols: df.loc[:, cols]
slc = lambda df, cols: df[cols]
ridx = lambda df, cols: df.reindex(columns=cols)
ridxa = lambda df, cols: df.reindex_axis(cols, 1)

isin = lambda df, dlst: ~df.columns.isin(dlst)
in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst)
comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()]
brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1)

테스팅

res1 = pd.DataFrame(
    index=pd.MultiIndex.from_product([
        'loc slc ridx ridxa'.split(),
        'setdiff1d difference columndrop setdifflst comprehension'.split(),
    ], names=['Select', 'Label']),
    columns=[10, 30, 100, 300, 1000],
    dtype=float
)

res2 = pd.DataFrame(
    index=pd.MultiIndex.from_product([
        'loc'.split(),
        'isin in1d comp brod'.split(),
    ], names=['Select', 'Label']),
    columns=[10, 30, 100, 300, 1000],
    dtype=float
)

res = res1.append(res2).sort_index()

dres = pd.Series(index=res.columns, name='drop')

for j in res.columns:
    dlst = list(range(j))
    cols = list(range(j // 2, j + j // 2))
    d = pd.DataFrame(1, range(10), cols)
    dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100)
    for s, l in res.index:
        stmt = '{}(d, {}(d, dlst))'.format(s, l)
        setp = 'from __main__ import d, dlst, {}, {}'.format(s, l)
        res.at[(s, l), j] = timeit(stmt, setp, number=100)

rs = res / dres

rs

                          10        30        100       300        1000
Select Label                                                           
loc    brod           0.747373  0.861979  0.891144  1.284235   3.872157
       columndrop     1.193983  1.292843  1.396841  1.484429   1.335733
       comp           0.802036  0.732326  1.149397  3.473283  25.565922
       comprehension  1.463503  1.568395  1.866441  4.421639  26.552276
       difference     1.413010  1.460863  1.587594  1.568571   1.569735
       in1d           0.818502  0.844374  0.994093  1.042360   1.076255
       isin           1.008874  0.879706  1.021712  1.001119   0.964327
       setdiff1d      1.352828  1.274061  1.483380  1.459986   1.466575
       setdifflst     1.233332  1.444521  1.714199  1.797241   1.876425
ridx   columndrop     0.903013  0.832814  0.949234  0.976366   0.982888
       comprehension  0.777445  0.827151  1.108028  3.473164  25.528879
       difference     1.086859  1.081396  1.293132  1.173044   1.237613
       setdiff1d      0.946009  0.873169  0.900185  0.908194   1.036124
       setdifflst     0.732964  0.823218  0.819748  0.990315   1.050910
ridxa  columndrop     0.835254  0.774701  0.907105  0.908006   0.932754
       comprehension  0.697749  0.762556  1.215225  3.510226  25.041832
       difference     1.055099  1.010208  1.122005  1.119575   1.383065
       setdiff1d      0.760716  0.725386  0.849949  0.879425   0.946460
       setdifflst     0.710008  0.668108  0.778060  0.871766   0.939537
slc    columndrop     1.268191  1.521264  2.646687  1.919423   1.981091
       comprehension  0.856893  0.870365  1.290730  3.564219  26.208937
       difference     1.470095  1.747211  2.886581  2.254690   2.050536
       setdiff1d      1.098427  1.133476  1.466029  2.045965   3.123452
       setdifflst     0.833700  0.846652  1.013061  1.110352   1.287831

fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True)
for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]):
    ax = axes[i // 2, i % 2]
    g.plot.bar(ax=ax, title=n)
    ax.legend_.remove()
fig.tight_layout()

이것은 실행하는 데 걸리는 시간과 관련이 있습니다 df.drop(dlst, 1, errors='ignore'). 모든 노력을 기울인 후에는 성능이 약간 향상되는 것 같습니다.

여기에 이미지 설명을 입력하십시오

사실 경우 최적의 솔루션을 사용 reindex또는 reindex_axis해킹에 list(set(df.columns.values.tolist()).difference(dlst)). 가까운 두번째 여전히 매우 근소하게 더보다는 drop이다 np.setdiff1d.

rs.idxmin().pipe(
    lambda x: pd.DataFrame(
        dict(idx=x.values, val=rs.lookup(x.values, x.index)),
        x.index
    )
)

                      idx       val
10     (ridx, setdifflst)  0.653431
30    (ridxa, setdifflst)  0.746143
100   (ridxa, setdifflst)  0.816207
300    (ridx, setdifflst)  0.780157
1000  (ridxa, setdifflst)  0.861622

2

도트 구문은 JavaScript에서는 작동하지만 Python에서는 작동하지 않습니다.

  • 파이썬 : del df['column_name']
  • 자바 스크립트 : del df['column_name'] 또는 del df.column_name

2

원래 데이터 프레임 df이 너무 크지 않은 경우 메모리 제한이 없으며 열을 몇 개만 유지하면 필요한 열만 사용하여 새 데이터 프레임을 만들 수도 있습니다.

new_df = df[['spam', 'sausage']]

2

drop () 메소드 로 지정된 열 또는 구체화 된 열을 제거 하거나 삭제할 수 있습니다 .

df 가 데이터 프레임 이라고 가정합니다 .

제거 할 열 = column0

암호:

df = df.drop(column0, axis=1)

여러 열 col1, col2,를 제거하려면. . . , coln, 목록에서 제거해야 할 모든 열을 삽입해야합니다. 그런 다음 drop () 메소드로 제거하십시오.

암호:

df = df.drop([col1, col2, . . . , coln], axis=1)

도움이 되길 바랍니다.


df = df.drop([col1, col2, . . . , coln], axis=1)col1, col2 등 대신 변수 이름을 지정하면 작동하지 않습니다. 정확히 존재하면 축에 오류 열이 표시되지 않습니다. @Littin 도와 드릴까요?
RSM

1

Pandas DataFrame에서 열을 삭제하는 다른 방법

내부 삭제를 원하지 않는 경우 DataFrame(...)함수를 사용하여 열을 지정하여 새 DataFrame을 만들 수 있습니다.

my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']}

df = pd.DataFrame(my_dict)

다음과 같이 새 DataFrame을 만듭니다.

newdf = pd.DataFrame(df, columns=['name', 'age'])

del / drop으로 얻는 것만 큼 좋은 결과를 얻습니다.


1
이것은 기술적으로 정확하지만 삭제하려는 하나 또는 몇 개의 열 대신 유지하기 위해 모든 열을 나열 해야하는 것은 어리석은 것처럼 보입니다.
cs95
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.