467 Stimmen

Pandas-Zeilen mit doppelten Indizes entfernen

Wie entfernt man Zeilen mit doppelten Indexwerten?

In dem unten stehenden Wetter-DataFrame geht ein Wissenschaftler manchmal zurück und korrigiert Beobachtungen - nicht, indem er die fehlerhaften Zeilen bearbeitet, sondern indem er eine doppelte Zeile an das Ende einer Datei anhängt.

Ich lese gerade einige automatische Wetterdaten aus dem Internet aus (die Beobachtungen erfolgen alle 5 Minuten und werden in monatlichen Dateien für jede Wetterstation zusammengefasst). Nach dem Parsen einer Datei sieht der DataFrame wie folgt aus:

                      Sta  Precip1hr  Precip5min  Temp  DewPnt  WindSpd  WindDir  AtmPress
Date                                                                                      
2001-01-01 00:00:00  KPDX          0           0     4       3        0        0     30.31
2001-01-01 00:05:00  KPDX          0           0     4       3        0        0     30.30
2001-01-01 00:10:00  KPDX          0           0     4       3        4       80     30.30
2001-01-01 00:15:00  KPDX          0           0     3       2        5       90     30.30
2001-01-01 00:20:00  KPDX          0           0     3       2       10      110     30.28

Beispiel für einen doppelten Fall:

import pandas as pd
import datetime

startdate = datetime.datetime(2001, 1, 1, 0, 0)
enddate = datetime.datetime(2001, 1, 1, 5, 0)
index = pd.date_range(start=startdate, end=enddate, freq='H')
data1 = {'A' : range(6), 'B' : range(6)}
data2 = {'A' : [20, -30, 40], 'B' : [-50, 60, -70]}
df1 = pd.DataFrame(data=data1, index=index)
df2 = pd.DataFrame(data=data2, index=index[:3])
df3 = df2.append(df1)

df3
                       A   B
2001-01-01 00:00:00   20 -50
2001-01-01 01:00:00  -30  60
2001-01-01 02:00:00   40 -70
2001-01-01 03:00:00    3   3
2001-01-01 04:00:00    4   4
2001-01-01 05:00:00    5   5
2001-01-01 00:00:00    0   0
2001-01-01 01:00:00    1   1
2001-01-01 02:00:00    2   2

Und deshalb brauche ich df3 zu werden:

                       A   B
2001-01-01 00:00:00    0   0
2001-01-01 01:00:00    1   1
2001-01-01 02:00:00    2   2
2001-01-01 03:00:00    3   3
2001-01-01 04:00:00    4   4
2001-01-01 05:00:00    5   5

Ich dachte, dass das Hinzufügen einer Spalte mit Zeilennummern ( df3['rownum'] = range(df3.shape[0]) ) würde mir helfen, die unterste Zeile für jeden Wert der DatetimeIndex aber ich komme nicht weiter, wenn ich die group_by o pivot (oder ???) Anweisungen, damit das funktioniert.

2 Stimmen

Eine andere Möglichkeit, Duplikate zu erhalten, sind stündliche Daten in der Nacht, wenn die Uhren für die Sommerzeit zurückgestellt werden: 1 AM, 2, 3, 2, wieder 3, 4 ...

1 Stimmen

Wenn Sie sagen "Duplikate entfernen" Ihr Kontext ist hier implizit "behalte das Erste", d.h. drop_duplicates(keep='first') . (Das ist nicht immer der Fall, manchmal ist es schwieriger, aus den anderen Feldern herauszufinden, welche Zeile beibehalten werden soll, oder mehrere zusammenzuführen, indem man NAs aus verschiedenen Zeilen ausfüllt).

4voto

bbiegel Punkte 207

Wenn jemand wie ich die verkettbare Datenmanipulation mit der Pandas-Punkt-Notation (wie Piping) mag, dann könnte das folgende nützlich sein:

df3 = df3.query('~index.duplicated()')

Dies ermöglicht die Verkettung von Anweisungen wie dieser:

df3.assign(C=2).query('~index.duplicated()').mean()

0 Stimmen

Ich habe dies ausprobiert, konnte es aber nicht zum Laufen bringen. Ich bekomme eine Fehlermeldung wie diese: TypeError: 'Series' objects are mutable, thus they cannot be hashed .. Hat das bei Ihnen tatsächlich funktioniert?

0 Stimmen

Es funktionierte für mich, mit Pandas 1.2.2. Ich musste die Konstruktion des Indexes ändern, da .DateTimeIndex unterstützt nicht start et end Argumente nicht mehr, aber ich habe .date_range stattdessen.

0voto

Berny Punkte 113

Ich hatte die Erfahrung mit diesem gleichen Fehler, und nach dem Tauchen in jeder df, es stellt sich heraus, einer der hatte 2 Spalten mit dem gleichen Namen, Sie erwähnen Sie einige Spalten fallen, wahrscheinlich könnte dies ein Grund sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X