Mam trochę danych i kiedy je importuję, otrzymuję następujące niepotrzebne kolumny Szukam łatwego sposobu na usunięcie ich wszystkich
'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'
Są indeksowane przez indeksowanie 0, więc spróbowałem czegoś takiego
df.drop(df.columns[[22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)
Ale to nie jest zbyt wydajne. Próbowałem napisać kilka pętli for, ale wydało mi się to złe zachowanie Pand. Dlatego zadaję tutaj pytanie.
Widziałem kilka przykładów, które są podobne ( upuść wiele pand kolumn ), ale to nie odpowiada na moje pytanie.
df.drop
listę nazw kolumn:df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
df = df[cols_of_interest]
przeciwnym razie można bydf.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
Odpowiedzi:
Nie wiem, co masz na myśli mówiąc nieefektywne, ale jeśli chodzi o pisanie, łatwiej byłoby po prostu wybrać kolumny, które nas interesują i przypisać je z powrotem do df:
Gdzie
cols_of_interest
jest lista kolumn, na których Ci zależy.Możesz też pokroić kolumny i przekazać to do
drop
:df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
Wywołanie po
head
prostu wybiera 0 wierszy, ponieważ interesują nas tylko nazwy kolumn, a nie daneaktualizacja
Inna metoda: prościej byłoby użyć maski logicznej zi
str.contains
odwrócić ją, aby zamaskować kolumny: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: []
źródło
df
nową kolumną, byćappend
może powinieneś, ale tak naprawdę nie rozumiem twojego pytania, powinieneś opublikować prawdziwe pytanie na SO zamiast pytać jako komentarz, ponieważ jest to kiepska forma na SOZdecydowanie najprostsze podejście to:
yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)
źródło
SettingWithCopyWarning
ostrzeżenie?axis
Wyjaśniony termin : stackoverflow.com/questions/22149584/… . Zasadniczoaxis=0
mówi się, że jest „pod względem kolumn” iaxis=1
„pod względem wierszy”.inplace=True
środki, żeDataFrame
jest modyfikowany w miejscu.yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
Mój osobisty ulubiony i łatwiejszy niż odpowiedzi, które widziałem tutaj (dla wielu kolumn):
df.drop(df.columns[22:56], axis=1, inplace=True)
Lub tworzenie listy dla wielu kolumn.
col = list(df.columns)[22:56] df.drop(col, axis=1, inplace=1)
źródło
To prawdopodobnie dobry sposób na robienie tego, co chcesz. Spowoduje to usunięcie wszystkich kolumn, które zawierają w nagłówku słowo „Bez nazwy”.
for col in df.columns: if 'Unnamed' in col: del df[col]
źródło
for col in df.columns:
można uprościćfor col in df:
, także PO nie wskazał co schemat nazewnictwa dla pozostałych kolumn, mogą zawierać wszystko „Bez nazwy”, także ten jest nieskuteczny, ponieważ usuwa kolumny po jednym na razinplace = True
Możesz to zrobić w jednej linii i za jednym razem:
df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)
Wiąże się to z mniejszym poruszaniem się / kopiowaniem obiektu niż powyższe rozwiązania.
źródło
Nie jestem pewien, czy to rozwiązanie zostało jeszcze nigdzie wspomniane, ale można to zrobić
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: []
źródło
Proste i łatwe. Usuń wszystkie kolumny po 22.
df.drop(columns=df.columns[22:]) # love it
źródło
df
w miejscu, dodaj flagęinplace=True
, więcdf.drop(columns=df.columns[22:], inplace=True)
Możesz po prostu przekazać nazwy kolumn jako listę z określeniem osi jako 0 lub 1
Domyślnie oś = 0
data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)
źródło
Poniższe działały dla mnie:
for col in df: if 'Unnamed' in col: #del df[col] print col try: df.drop(col, axis=1, inplace=True) except Exception: pass
źródło
df = df[[col for col in df.columns if not ('Unnamed' in col)]]
źródło