Podczas usuwania kolumny w ramce danych używam:
del df['column_name']
I to działa świetnie. Dlaczego nie mogę użyć poniższych?
del df.column_name
Ponieważ można uzyskać dostęp do kolumny / serii as df.column_name
, spodziewałem się, że to zadziała.
Odpowiedzi:
Jak się domyślacie, właściwa składnia to
Trudno jest
del df.column_name
pracować po prostu ze względu na ograniczenia składniowe w Pythonie.del df[name]
zostaje przetłumaczonedf.__delitem__(name)
na okładki przez Python.źródło
class A(object): def __init__(self): self.var = 1
tworzy klasę, a potema = A(); del a.var
działa dobrze ...del df[name]
zostaje przetłumaczone nadf.__delitem__(name)
metodę, którą DataFrame może wdrożyć i zmodyfikować zgodnie ze swoimi potrzebami. W przypadkudel df.name
zmiennej członka jest usuwana bez szansy na uruchomienie dowolnego kodu niestandardowego. Zastanów się nad własnym przykładem - czy możesz uzyskaćdel a.var
wydruk „usuwania zmiennej”? Jeśli możesz, powiedz mi jak. Nie mogę :)pandas
twórcy tego nie zrobili , ale to nie znaczy, że jest to trudne.Najlepszym sposobem na to w pandach jest użycie
drop
:gdzie
1
jest numerem osi (0
dla wierszy i1
kolumn).Aby usunąć kolumnę bez konieczności ponownego przypisywania
df
, możesz:Na koniec, aby upuścić według numeru kolumny zamiast według etykiety kolumny , spróbuj to usunąć, np. 1., 2. i 4. kolumna:
Pracuje również ze składnią „tekstową” dla kolumn:
źródło
del
z jakiegoś powodu jest to zalecane ?drop
przezdel
to, żedrop
pozwala usunąć kilka kolumn na raz, należy wykonać W miejscu pracy, czy nie, a także usuwanie zapisów wzdłuż każdej osi (szczególnie przydatny do matrycy 3-D lubPanel
)drop
nadel
to, że spadek jest częścią API pandy i zawiera dokumentację.Posługiwać się:
Spowoduje to usunięcie jednej lub więcej kolumn w miejscu. Pamiętaj, że
inplace=True
został dodany w pandach v0.13 i nie będzie działać na starszych wersjach. W takim przypadku musisz przypisać wynik z powrotem:źródło
df.drop(list,inplace=True,axis=1)
del
- może upuścić więcej niż jedną kolumnę na raz.Upuść według indeksu
Usuń pierwszą, drugą i czwartą kolumnę:
Usuń pierwszą kolumnę:
Istnieje opcjonalny parametr,
inplace
dzięki czemu oryginalne dane można modyfikować bez tworzenia kopii.Wyskoczył
Wybór kolumny, dodawanie, usuwanie
Usuń kolumnę
column-name
:Przykłady:
print df
:df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:three = df.pop('three')
print df
:źródło
df.T.pop('A')
df
. Możesz to zrobić,df = df.T; df.pop(index); df = df.T
ale wydaje się to przesadne.df.drop(df.columns[[0]], axis=1, inplace=True)
nie wystarczy użyćdf.drop([0], axis=1)
?0
, todf.drop(0, axis=1)
działa dobrze. Ale jeśli nie znasz nazwy kolumny i potrzebujesz usunąć pierwszą kolumnę, to musiszdf.drop(df.columns[[0]], axis=1, inplace=True)
, wybierz pierwszą kolumnę według pozycji i upuść ją.Rzeczywiste pytanie, na które nie ma większości odpowiedzi tutaj:
Dlaczego nie mogę użyć
del df.column_name
?Najpierw musimy zrozumieć problem, który wymaga od nas zanurzenia się w magicznych metodach Pythona .
Jak Wes wskazuje w swojej odpowiedzi
del df['column']
mapuje na magiczną metodę pytona ,df.__delitem__('column')
która jest implementowana w pandach w celu upuszczenia kolumnyJednak, jak wskazano w powyższym linku na temat magicznych metod Pythona :
Można argumentować, że
del df['column_name']
nie należy go wykorzystywać ani zachęcać, a tym samymdel df.column_name
nie należy go nawet brać pod uwagę.Jednak teoretycznie
del df.column_name
mogłyby być implemeted do pracy w pand wykorzystujących ten sposób magiczne__delattr__
. Wprowadza to jednak pewne problemy, problemy, któredel df['column_name']
już ma wdrożenie, ale w mniejszym stopniu.Przykład problemu
Co jeśli zdefiniuję kolumnę w ramce danych o nazwie „dtypy” lub „kolumny”.
Załóżmy, że chcę usunąć te kolumny.
del df.dtypes
spowodowałoby, że__delattr__
metoda byłaby mylona, tak jakby powinna usunąć atrybut „dtypes” lub kolumnę „dtypes”.Pytania architektoniczne stojące za tym problemem
Odpowiedzi Pandy:
.ix
,.loc
ani.iloc
metod.TLDR;
Nie możesz tego zrobić,
del df.column_name
ponieważ pandy mają dość dziko rozwiniętą architekturę, którą należy ponownie rozważyć, aby tego rodzaju dysonans poznawczy nie pojawił się u jej użytkowników.Protip:
Nie używaj df.column_name, może być ładny, ale powoduje dysonans poznawczy
Cytaty Zen z Python, które pasują tutaj:
Istnieje wiele sposobów usuwania kolumny.
Kolumny są czasem atrybutami, a czasem nie.
Czy
del df.dtypes
usuwa atrybut dtypes lub kolumnę dtypes?źródło
__del__
prawie nigdy nie należy go używać ze względu na niepewne okoliczności, w jakich się go nazywa; używaj go ostrożnie!” jest tutaj zupełnie nieistotne, ponieważ stosowana jest tutaj metoda__delattr__
.del
wbudowane, a nie o.__del__
metodę instancji.del
Wbudowane jest do mapowania__delattr__
i__delitem__
która jest, co buduję mój argument na. Może więc chcesz ponownie przeczytać to, co napisałem.__
...__
zostaje zinterpretowany jako śmiały znacznik przez StackExchangePrzyjemnym dodatkiem jest możliwość upuszczania kolumn tylko wtedy, gdy istnieją . W ten sposób możesz objąć więcej przypadków użycia i spowoduje to usunięcie tylko istniejących kolumn z przekazanych do niego etykiet:
Po prostu dodaj błędy = „ignoruj” , na przykład:
źródło
od wersji 0.16.1 możesz to zrobić
źródło
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, jeśli taka aplikacja jest pożądana!Dobrą praktyką jest zawsze stosowanie
[]
zapisu. Jednym z powodów jest to, że notacja atrybutu (df.column_name
) nie działa w przypadku indeksów numerowanych:źródło
Odpowiedź Pandy 0,21+
Panda w wersji 0.21
drop
nieznacznie zmieniła metodę, aby uwzględnić zarówno parametry, jakindex
icolumns
parametry, aby pasowały do podpisu metodrename
ireindex
.Osobiście wolę używać
axis
parametru do oznaczania kolumn lub indeksu, ponieważ jest to dominujący parametr słowa kluczowego używany w prawie wszystkich metodach pand. Ale teraz masz kilka dodatkowych opcji w wersji 0.21.źródło
W pandach 0.16.1+ można upuścić kolumny tylko wtedy, gdy istnieją zgodnie z rozwiązaniem opublikowanym przez @eiTanLaVi. Przed tą wersją można osiągnąć ten sam wynik dzięki warunkowemu zrozumieniu listy:
źródło
TL; DR
Dużo wysiłku, aby znaleźć nieco bardziej wydajne rozwiązanie. Trudno uzasadnić dodatkową złożoność, poświęcając jednocześnie prostotę
df.drop(dlst, 1, errors='ignore')
Preambuła
Usuwanie kolumny jest semantycznie takie samo jak wybieranie innych kolumn. Pokażę kilka dodatkowych metod do rozważenia.
Skupię się również na ogólnym rozwiązaniu polegającym na usuwaniu wielu kolumn naraz i umożliwieniu próby usunięcia kolumn nieobecnych.
Korzystanie z tych rozwiązań jest ogólne i będzie działać również w prostym przypadku.
Konfiguracja
Rozważ
pd.DataFrame
df
listę i do usunięciadlst
Wynik powinien wyglądać następująco:
Ponieważ zrównuję usuwanie kolumny z wyborem innych kolumn, podzielę ją na dwa typy:
Wybór etykiety
Zaczynamy od wytworzenia listy / tablicy etykiet reprezentujących kolumny, które chcemy zachować, i bez kolumn, które chcemy usunąć.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Kolumny z etykiet
Aby porównać proces selekcji, załóż:
Następnie możemy ocenić
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Które oceniają:
Kawałek boolowski
Możemy skonstruować tablicę / listę wartości logicznych do krojenia
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Kolumny z Boolean
Dla porównania
df.loc[: bools]
Które oceniają:
Solidny czas
Funkcje
Testowanie
Jest to względne w stosunku do czasu potrzebnego do uruchomienia
df.drop(dlst, 1, errors='ignore')
. Wygląda na to, że po całym tym wysiłku poprawiamy wydajność tylko w niewielkim stopniu.Jeśli to prawda, najlepsze rozwiązania wykorzystują
reindex
lubreindex_axis
włamują sięlist(set(df.columns.values.tolist()).difference(dlst))
. Blisko druga i wciąż bardzo nieznacznie lepsza niżdrop
jestnp.setdiff1d
.źródło
Składnia kropkowa działa w JavaScript, ale nie w Pythonie.
del df['column_name']
del df['column_name']
lubdel df.column_name
źródło
Jeśli twoja oryginalna ramka danych
df
nie jest zbyt duża, nie masz żadnych ograniczeń pamięci i potrzebujesz tylko kilku kolumn, możesz równie dobrze utworzyć nową ramkę danych tylko z potrzebnymi kolumnami:źródło
Możemy usunąć lub usunąć określoną kolumnę lub zwiędłe kolumny metodą drop () .
Załóżmy, że df jest ramką danych.
Kolumna do usunięcia = kolumna 0
Aby usunąć wiele kolumn col1, col2,. . . , coln, musimy wstawić wszystkie kolumny, które musiały zostać usunięte z listy. Następnie usuń je metodą drop ().
Mam nadzieję, że byłoby to pomocne.
źródło
df = df.drop([col1, col2, . . . , coln], axis=1)
to nie działa, jeśli podam nazwę zmiennej zamiast col1, col2 itd. Dostaję kolumnę błędu nie w osi, gdy jest zdecydowanie obecna. @ Littin Czy możesz pomóc?Kolejny sposób usuwania kolumny w Pandas DataFrame
jeśli nie szukasz usuwania w miejscu, możesz utworzyć nową ramkę danych, określając kolumny za pomocą
DataFrame(...)
funkcji jakoUtwórz nową ramkę danych jako
Otrzymujesz wynik tak dobry, jak to, co dostajesz z del / drop
źródło