Ich arbeite mit einem großen Datenrahmen und ich habe Mühe, eine effiziente Möglichkeit zu finden, bestimmte Daten zu beseitigen. Beachten Sie, dass ich versuche, Messungen von einem spezifischen Datum zu beseitigen.Schnellster Weg, um bestimmte Daten aus Pandas Datenrahmen zu beseitigen
Pandas hat diese große Funktion, wo Sie anrufen:
df.ix['2016-04-22']
und alle Zeilen aus diesem Tag ziehen. Aber was, wenn ich alle Zeilen von '2016-04-22' eliminieren möchte?
Ich möchte eine Funktion wie folgt aus:
df.ix[~'2016-04-22']
(aber das funktioniert nicht)
Auch was ist, wenn ich möchte eine Liste von Daten beseitigen?
Gerade jetzt, ich habe folgende Lösung:
import numpy as np
import pandas as pd
from numpy import random
###Create a sample data frame
dates = [pd.Timestamp('2016-04-25 06:48:33'), pd.Timestamp('2016-04-27 15:33:23'), pd.Timestamp('2016-04-23 11:23:41'), pd.Timestamp('2016-04-28 12:08:20'), pd.Timestamp('2016-04-21 15:03:49'), pd.Timestamp('2016-04-23 08:13:42'), pd.Timestamp('2016-04-27 21:18:22'), pd.Timestamp('2016-04-27 18:08:23'), pd.Timestamp('2016-04-27 20:48:22'), pd.Timestamp('2016-04-23 14:08:41'), pd.Timestamp('2016-04-27 02:53:26'), pd.Timestamp('2016-04-25 21:48:31'), pd.Timestamp('2016-04-22 12:13:47'), pd.Timestamp('2016-04-27 01:58:26'), pd.Timestamp('2016-04-24 11:48:37'), pd.Timestamp('2016-04-22 08:38:46'), pd.Timestamp('2016-04-26 13:58:28'), pd.Timestamp('2016-04-24 15:23:36'), pd.Timestamp('2016-04-22 07:53:46'), pd.Timestamp('2016-04-27 23:13:22')]
values = random.normal(20, 20, 20)
df = pd.DataFrame(index=dates, data=values, columns ['values']).sort_index()
### This is the list of dates I want to remove
removelist = ['2016-04-22', '2016-04-24']
grundsätzlich Diese for-Schleife packt den Index für die Daten, die ich entfernen möchten, dann beseitigt es aus dem Index des Hauptdatenrahmen, dann wählt sich positiv auf die verbleibende Daten (dh die guten Daten) aus dem Datenrahmen.
for r in removelist:
elimlist = df.ix[r].index.tolist()
ind = df.index.tolist()
culind = [i for i in ind if i not in elimlist]
df = df.ix[culind]
Gibt es etwas Besseres dort draußen?
Ich habe auch versucht die Indizierung durch die abgerundete Datum + 1 Tag, so etwas wie dieses:
df[~((df['Timestamp'] < r+pd.Timedelta("1 day")) & (df['Timestamp'] > r))]
Aber das wird wirklich umständlich und (am Ende des Tages) ich noch werde mit werden eine for-Schleife, wenn ich n spezifische Daten löschen muss.
Es muss einen besseren Weg geben! Recht? Könnte sein?
Super! Funktioniert perfekt! Vielen Dank für Ihre Antwort! – Reid