카테고리 보관물: Python

Python

팬더 DataFrame에서 열 삭제 작동합니다. 왜 다음을

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

del df['column_name']

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

del df.column_name

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



답변

짐작했듯이 올바른 구문은

del df['column_name']

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


답변

팬더에서 이것을 수행하는 가장 좋은 방법은 다음을 사용하는 것입니다 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)

답변

사용하다:

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

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

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

답변

인덱스로 삭제

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

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

답변

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

왜 사용할 수 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 열을 삭제 합니까 ?

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


답변

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

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

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

답변

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

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