Pandas의 열 이름을 기반으로 여러 열 삭제


95

일부 데이터가 있고 가져올 때 다음과 같은 불필요한 열이 표시됩니다. 이러한 모든 항목을 쉽게 삭제할 수있는 방법을 찾고 있습니다.

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

0- 인덱싱으로 인덱싱되므로 다음과 같은 것을 시도했습니다.

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

그러나 이것은 매우 효율적이지 않습니다. 나는 for 루프를 작성하려고 시도했지만 이것은 나쁜 Pandas 행동으로 나를 놀라게했습니다. 따라서 여기서 질문합니다.

비슷한 몇 가지 예를 보았지만 ( Drop multiple columns pandas ) 이것은 내 질문에 대답하지 않습니다.


2
효율적 이라는게 무슨 뜻이야? 너무 느리게 실행되고 있습니까? 문제가 삭제하려는 모든 열의 색인을 가져 오지 않으려 df.drop는 경우 열 이름 목록 만 제공 할 수 있습니다 .df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
Carsten

관심있는 열을 하위 집합으로 만드는 것이 더 쉽지 않을까요? 즉 df = df[cols_of_interest], 그렇지 않으면 df를 열로 분할하여 열을 얻을 수 있습니다.df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
EdChum

2
내가 입력 또는 '나쁜 코드 냄새'의 측면에서 비효율적 의미
Peadar 코일을

1
대부분의 경우 원하는 열을 유지 한 다음 원하지 않는 열을 삭제하는 것이 더 쉽습니다. df = df [ 'col_list']
sparrow

답변:


65

비효율적이라는 의미는 모르겠지만 입력 측면에서 의미하는 경우 관심있는 열을 선택하고 df에 다시 할당하는 것이 더 쉬울 수 있습니다.

df = df[cols_of_interest]

cols_of_interest관심있는 열 목록은 어디에 있습니까 ?

또는 열을 슬라이스하여 다음으로 전달할 수 있습니다 drop.

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

head데이터가 아닌 열 이름에만 관심이 있으므로 0 개의 행만 선택 하는 호출

최신 정보

다른 방법 : 부울 마스크를 사용 str.contains하고 반전하여 열을 마스크하는 것이 더 간단합니다 .

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []

~ df.columns ... (TypeError : bad operand type for unary ~ : 'str') 또는 df.columns.str.contains ... (AttributeError : 'Index'object has no attribute 'str'). 이것이 왜 그런지 어떤 아이디어?
Dai

@EdChum df = df [cols_of_interest]를 만들 수 있습니다 . 여기서 cols_of_interest 는 for 루프가 반복 될 때마다 열 이름을 추가합니까?

@Victor 아니 만약 당신이 df당신의 새로운 칼럼으로 당신 을 덮어 쓰는 다면 당신은 append아마도 당신의 질문을 이해하지 못합니다. 당신은 SO에 대한 형편없는 형태이기 때문에 코멘트로 묻는 것보다 SO에 실제 질문을 게시해야합니다
EdChum

@EdChum 당신이 절대적으로 옳습니다. 나는 질문을 만들었고 SO의 다른 부분을 검색하여 해결하려고 노력하고 있습니다. 여기 링크가 있습니다 ! 어떤 기여 도움이 될 것입니다 stackoverflow.com/questions/48923915/...을

214

가장 간단한 방법은 다음과 같습니다.

yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)

1
일부 코드에서이 형식을 사용했는데 SettingWithCopyWarning경고 가 표시됩니까?
KillerSnail

2
@KillerSnail, 무시하도록 저장됩니다. 오류를 방지하려면 다음을 시도하십시오. df = df.drop ([ 'colheading1', 'colheading2'], axis = 1)
Philipp Schwarz

5
용어 axis설명 : stackoverflow.com/questions/22149584/… . 기본적으로 axis=0는 "열 방식"이고 axis=1"행 방식"이라고합니다.
Rohmer

5
그리고 가 제자리에서 수정 inplace=True되었음을 의미합니다 DataFrame.
Rohmer

1
당신은 경고를하지 않을 경우 @Killernail 수행yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
happy_sisyphus

41

개인적으로 가장 좋아하고 여기에서 본 답변보다 쉽습니다 (여러 열).

df.drop(df.columns[22:56], axis=1, inplace=True)

또는 여러 열에 대한 목록을 만듭니다.

col = list(df.columns)[22:56]
df.drop(col, axis=1, inplace=1)

8
이것이 답이되어야합니다. 간단한 네이티브 Pandas 인덱싱 구문을 사용하여 가장 깨끗하고 읽기 쉽습니다.
Brent Faust

2
이 답변에는 다른 답변이 아니라 옆에 녹색 체크 표시가 있어야합니다.
Siavosh Mahboubian

1
작은 수정 (내가 잘못하지 않는 한) : 두 번째 코드 블록에는 'inplace = 1'대신 'inplace = True'가 있어야합니다.
Thredolsen

20

이것은 당신이 원하는 것을하는 좋은 방법 일 것입니다. 헤더에 'Unnamed'가 포함 된 모든 열이 삭제됩니다.

for col in df.columns:
    if 'Unnamed' in col:
        del df[col]

이것은 다음과 for col in df.columns:같이 단순화 될 수 있습니다 for col in df:. 또한 OP는 다른 열에 대한 이름 지정 체계가 무엇인지 표시하지 않았으며 모두 'Unnamed'를 포함 할 수 있습니다. 또한 한 번에 하나씩 열을 제거하므로 비효율적입니다
EdChum

확실히 효율적이지는 않지만 거대한 데이터 프레임에서 작업하지 않는 한 큰 영향을 미치지 않습니다. 이 방법의 장점은 기억하기 쉽고 코드 작성이 빠르다는 것입니다. 보관하려는 열 목록을 작성하는 것은 매우 고통 스러울 수 있습니다.
knightofni

로컬 사본을 만들 필요가 없기 때문에 이것이 큰 df에서 가장 성능이 좋을 것 같습니다inplace = True
Matt

13

한 줄로 한 번에이 작업을 수행 할 수 있습니다.

df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)

이것은 위의 솔루션보다 물체의 이동 / 복사를 덜 포함합니다.


11

이 솔루션이 아직 어디에서나 언급되었는지 확실하지 않지만 한 가지 방법은 pandas.Index.difference.

>>> df = pd.DataFrame(columns=['A','B','C','D'])
>>> df
Empty DataFrame
Columns: [A, B, C, D]
Index: []
>>> to_remove = ['A','C']
>>> df = df[df.columns.difference(to_remove)]
>>> df
Empty DataFrame
Columns: [B, D]
Index: []

4

축을 0 또는 1로 지정하여 열 이름을 목록으로 전달할 수 있습니다.

  • axis = 1 : 행을 따라
  • axis = 0 : 열을 따라
  • 기본적으로 axis = 0

    data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)


4

간단하고 쉽습니다. 22 일 이후의 모든 열을 제거합니다.

df.drop(columns=df.columns[22:]) # love it

df제자리에서 수정하려면 플래그를 추가합니다 inplace=True. So thatdf.drop(columns=df.columns[22:], inplace=True)
arilwan

1

아래는 나를 위해 일했습니다.

for col in df:
    if 'Unnamed' in col:
        #del df[col]
        print col
        try:
            df.drop(col, axis=1, inplace=True)
        except Exception:
            pass

0

df = df[[col for col in df.columns if not ('Unnamed' in col)]]


1
이는 원하지 않는 열이 삭제되지 않고 필터링된다는 점을 제외하면 Peter와 유사합니다.
Sarah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.