Was ist der einfachste Weg, um doppelte Spalten aus einem Datenrahmen zu entfernen?
Ich lese eine Textdatei mit doppelten Spalten über:
import pandas as pd
df=pd.read_table(fname)
Die Spaltennamen sind:
Time, Time Relative, N2, Time, Time Relative, H2, etc...
Alle Spalten "Zeit" und "Zeitrelativ" enthalten dieselben Daten. Ich will:
Time, Time Relative, N2, H2
Alle meine Versuche zu löschen, zu löschen usw. wie:
df=df.T.drop_duplicates().T
Ergebnis zu eindeutig bewerteten Indexfehlern:
Reindexing only valid with uniquely valued index objects
Tut mir leid, dass ich ein Pandas Noob bin. Anregungen wäre dankbar.
Weitere Details
Pandas-Version: 0.9.0
Python-Version: 2.7.3
Windows 7
(installiert über Pythonxy 2.7.3.0)
Datendatei (Hinweis: In der realen Datei werden Spalten durch Tabulatoren getrennt, hier durch 4 Leerzeichen):
Time Time Relative [s] N2[%] Time Time Relative [s] H2[ppm]
2/12/2013 9:20:55 AM 6.177 9.99268e+001 2/12/2013 9:20:55 AM 6.177 3.216293e-005
2/12/2013 9:21:06 AM 17.689 9.99296e+001 2/12/2013 9:21:06 AM 17.689 3.841667e-005
2/12/2013 9:21:18 AM 29.186 9.992954e+001 2/12/2013 9:21:18 AM 29.186 3.880365e-005
... etc ...
2/12/2013 2:12:44 PM 17515.269 9.991756+001 2/12/2013 2:12:44 PM 17515.269 2.800279e-005
2/12/2013 2:12:55 PM 17526.769 9.991754e+001 2/12/2013 2:12:55 PM 17526.769 2.880386e-005
2/12/2013 2:13:07 PM 17538.273 9.991797e+001 2/12/2013 2:13:07 PM 17538.273 3.131447e-005
import pandas as pd; pd.__version__
)read_table
für das Beispiel, das ich erstellt habe, einzigartig .Antworten:
Es gibt eine einzeilige Lösung für das Problem. Dies gilt, wenn einige Spaltennamen dupliziert sind und Sie sie entfernen möchten:
Wie es funktioniert:
Angenommen, die Spalten des Datenrahmens sind
['alpha','beta','alpha']
df.columns.duplicated()
Gibt ein boolesches Array zurück: aTrue
oderFalse
für jede Spalte. Wenn diesFalse
der Fall ist, ist der Spaltenname bis zu diesem Punkt eindeutig. Wenn dies der Fall ist, wirdTrue
der Spaltenname früher dupliziert. In dem angegebenen Beispiel wäre der zurückgegebene Wert beispielsweise[False,False,True]
.Pandas
ermöglicht die Indizierung mit booleschen Werten, wobei nur dieTrue
Werte ausgewählt werden. Da wir die nicht duplizierten Spalten behalten möchten, muss das obige boolesche Array gespiegelt werden (dh[True, True, False] = ~[False,False,True]
)Schließlich werden
df.loc[:,[True,True,False]]
nur die nicht duplizierten Spalten unter Verwendung der oben genannten Indizierungsfunktion ausgewählt.Hinweis : Das obige prüft nur Spaltennamen , keine Spaltenwerte.
quelle
df.T.drop_duplicates().T
.Es hört sich so an, als ob Sie die eindeutigen Spaltennamen bereits kennen. Wenn das der Fall ist,
df = df['Time', 'Time Relative', 'N2']
würde es funktionieren.Wenn nicht, sollte Ihre Lösung funktionieren:
Sie haben wahrscheinlich etwas Spezielles für Ihre Daten, das es durcheinander bringt. Wir könnten mehr Hilfe geben, wenn Sie uns mehr Details zu den Daten geben könnten.
Bearbeiten: Wie Andy sagte, liegt das Problem wahrscheinlich bei den doppelten Spaltentiteln.
Für eine Beispieltabellendatei 'dummy.csv' habe ich Folgendes zusammengestellt:
using
read_table
gibt eindeutige Spalten und funktioniert ordnungsgemäß:Wenn Ihre Version dies nicht zulässt, können Sie eine Lösung zusammenstellen, um sie einzigartig zu machen:
quelle
df['Time']
Wählt leider alle Zeitreihen aus (dh gibt einen DataFrame zurück), unddf['Time', ..]
dies gibt den gesamten DataFrame zurück.RecursionError: maximum recursion depth exceeded
Das Transponieren ist für große DataFrames ineffizient. Hier ist eine Alternative:
Verwenden Sie es so:
Bearbeiten
Eine speichereffiziente Version, die Nans wie jeden anderen Wert behandelt:
quelle
my_df.T.drop_duplicates().T
würde an großen Datenrahmen hängen./usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:17: DeprecationWarning: 'pandas.core.common.array_equivalent' is deprecated and is no longer public API
if array_equivalent(ia, ja):
durchif np.array_equal(ia, ja):
scheint die gleichen Ergebnisse zu liefern, aber ich habe gelesen, dass es NaNs nicht gut handhabt.array_equivalent
noch im öffentlichen Repo verfügbar, möglicherweise in einer älteren Filiale?numpy.array_equiv
; Für Pandas sehe ich keine früheren Release-Zweige auf GitHub,pandas.core.common
aber vielleicht gibt es noch andere Orte, an denen man suchen kannWenn ich mich nicht irre, wird im Folgenden das getan, was ohne die Speicherprobleme der Transponierungslösung und mit weniger Zeilen als die Funktion von @kalu gefragt wurde, wobei die erste von ähnlich benannten Spalten beibehalten wird.
quelle
Es sieht so aus, als wären Sie auf dem richtigen Weg. Hier ist der Einzeiler, den Sie gesucht haben:
Da es jedoch keinen Beispieldatenrahmen gibt, der die referenzierte Fehlermeldung erzeugt
Reindexing only valid with uniquely valued index objects
, ist es schwierig, genau zu sagen, was das Problem lösen würde. Wenn es Ihnen wichtig ist, den ursprünglichen Index wiederherzustellen, gehen Sie wie folgt vor:quelle
Erster Schritt: - Lesen Sie die erste Zeile, dh alle Spalten, und entfernen Sie alle doppelten Spalten.
Zweiter Schritt: - Lesen Sie schließlich nur diese Spalten.
quelle
Ich bin auf dieses Problem gestoßen, bei dem der von der ersten Antwort bereitgestellte Einzeiler gut funktioniert hat. Ich hatte jedoch die zusätzliche Komplikation, dass die zweite Kopie der Spalte alle Daten enthielt. Die erste Kopie nicht.
Die Lösung bestand darin, zwei Datenrahmen durch Teilen des einen Datenrahmens durch Umschalten des Negationsoperators zu erstellen. Sobald ich die beiden Datenrahmen hatte, führte ich eine Join-Anweisung mit dem aus
lsuffix
. Auf diese Weise konnte ich dann die Spalte ohne die Daten referenzieren und löschen.- E.
quelle
Auf die folgende Weise werden betrogene Spalten identifiziert, um zu überprüfen, was beim ursprünglichen Erstellen des Datenrahmens falsch läuft.
quelle
Schnelle und einfache Möglichkeit, die duplizierten Spalten nach ihren Werten zu löschen:
df = df.T.drop_duplicates (). T.
Weitere Informationen: Pandas DataFrame drop_duplicates Handbuch .
quelle