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