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

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

   '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 ) 이것은 내 질문에 대답하지 않습니다.



답변

비효율적이라는 의미는 모르겠지만 입력 측면에서 의미하는 경우 관심있는 열을 선택하고 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: []


답변

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

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


답변

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

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

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

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


답변

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

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


답변

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

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

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


답변

이 솔루션이 아직 어디에서나 언급되었는지 확실하지 않지만 한 가지 방법은 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: []


답변

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

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

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