Mam ramkę danych df:
>>> df
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20060630 6.590 NaN 6.590 5.291
20060930 10.103 NaN 10.103 7.981
20061231 15.915 NaN 15.915 12.686
20070331 3.196 NaN 3.196 2.710
20070630 7.907 NaN 7.907 6.459
Następnie chcę upuścić wiersze z pewnymi numerami sekwencji, które wskazano na liście, przypuśćmy, że tutaj [1,2,4],
pozostało:
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20061231 15.915 NaN 15.915 12.686
20070630 7.907 NaN 7.907 6.459
Jak lub jaką funkcję może to zrobić?
Odpowiedzi:
Użyj DataFrame.drop i przekaż mu serię etykiet indeksu:
źródło
axis=0
(0 = wiersze, 1 = kolumny) iinplace=True
jak wdf.drop(df.index[[1,3]], axis=0, inplace=True)
. @ mezzanaccio, jeśli konkretnie wiesz, które indeksy chcesz zastąpić (a także używając swojego przykładu od 0 do n):df.drop(df.index[range(0, n)], axis=0, inplace=True)
Zauważ, że może być ważne użycie polecenia „inplace”, gdy chcesz wykonać drop-line.
Ponieważ pierwotne pytanie nic nie zwraca, należy użyć tego polecenia. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html
źródło
Jeśli DataFrame jest ogromna, a liczba wierszy do upuszczenia jest również duża, zwykłe upuszczanie według indeksu
df.drop(df.index[])
zajmuje zbyt dużo czasu.W moim przypadku mam wielokrotnie indeksowaną ramkę danych typu float
100M rows x 3 cols
i muszę z niej usunąć10k
wiersze. Najszybszą metodą, jaką znalazłem, jest, całkiem nieintuicyjnie, dotake
pozostałych wierszy.Niech
indexes_to_drop
będzie tablicą indeksów pozycyjnych do usunięcia ([1, 2, 4]
w pytaniu).W moim przypadku zajęło to
20.5s
, podczas gdy prostedf.drop
zajęło5min 27s
i pochłonęło dużo pamięci. Wynikowa ramka danych jest taka sama.źródło
Można również przejść do DataFrame.drop ten sam label (zamiast serii etykiet Index):
Co odpowiada:
źródło
Rozwiązałem to w prostszy sposób - tylko w 2 krokach.
Krok 1: Najpierw utwórz ramkę danych z niechcianymi wierszami / danymi.
Krok 2: Użyj indeksu tej niechcianej ramki danych, aby usunąć wiersze z oryginalnej ramki danych.
Przykład:
Załóżmy, że masz ramkę danych df, która ma tyle kolumn, w tym „Wiek”, który jest liczbą całkowitą. Powiedzmy, że chcesz upuścić wszystkie wiersze z „Wiek” jako liczbą ujemną.
Krok 1: df_age_negative = df [df ['Age'] <0]
Krok 2: df = df.drop (df_age_negative.index, axis = 0)
Mam nadzieję, że jest to o wiele prostsze i pomaga.
źródło
Jeśli chcę upuścić wiersz, który powiedzmy indeks
x
, zrobiłbym następujące:Gdybym chciał usunąć wiele indeksów (powiedzmy, że te indeksy są na liście
unwanted_indices
), zrobiłbym:źródło
Oto nieco konkretny przykład, który chciałbym pokazać. Powiedz, że masz wiele zduplikowanych wpisów w niektórych swoich wierszach. Jeśli masz wpisy ciągu, możesz łatwo użyć metod ciągu, aby znaleźć wszystkie indeksy do usunięcia.
A teraz upuść te wiersze za pomocą ich indeksów
źródło
W komentarzu do odpowiedzi @ theodros-zelleke @ j-jones zapytał, co zrobić, jeśli indeks nie jest unikalny. Musiałem poradzić sobie z taką sytuacją. Przed wywołaniem zmieniłem nazwę duplikatów w indeksie
drop()
a la:gdzie
rename_duplicates()
jest funkcja, którą zdefiniowałem, która przeszła przez elementy indeksu i zmieniła nazwę duplikatów. Użyłem tego samego wzorca zmiany nazwy, copd.read_csv()
w kolumnach, tzn."%s.%d" % (name, count)
Gdziename
jest nazwą wiersza icount
ile razy poprzednio wystąpił.źródło
Określanie indeksu na podstawie wartości logicznej, jak opisano powyżej, np
może wymagać więcej pamięci niż określanie indeksu przy użyciu tej metody
zastosowane w ten sposób
Ta metoda jest przydatna w przypadku dużych ramek danych i ograniczonej pamięci.
źródło
Użyj tylko argumentu Argument, aby upuścić wiersz: -
Dla wielu rzędów: -
źródło
Rozważ przykładową ramkę danych
chcemy upuścić 2. i 3. wiersz indeksu.
Podejście 1:
Podejście 2
źródło