2016-07-29 13 views
2

Ich hämmere meinen Kopf gegen die Wand, wenn ich versuche, ein Drop-Duplikat für Zeitreihen durchzuführen, basierend auf dem Wert eines Datetime-Indexes.Wie man pandas drop_duplicates basierend auf der Indexspalte ausführt

Meine Funktion ist die folgende:

def csv_import_merge_T(f): 
    dfsT = [pd.read_csv(fp, index_col=[0], parse_dates=[0], dayfirst=True, names=['datetime','temp','rh'], header=0) for fp in files] 
    dfT = pd.concat(dfsT) 
    #print dfT.head(); print dfT.index; print dfT.dtypes 
    dfT.drop_duplicates(subset=index, inplace=True) 
    dfT.resample('H').bfill() 
    return dfT 

, die durch genannt wird:

inputcsvT = ['./input_csv/A08_KI_T*.csv'] 
for csvnameT in inputcsvT: 
    files = glob.glob(csvnameT) 
    print ('___'); print (files) 
    t = csv_import_merge_T(files) 
    print csvT 

I erhalten

NameError: global name 'index' is not defined 

den Fehler, was falsch ist?

UPDATE: Das Problem scheint zu entstehen, wenn csv-Eingabedateien (die verkettet werden) überlappen.

inputcsvT = ['./input_csv/A08_KI_T*.csv'] bekommt Dateien

A08_KI_T5
28/05/2015 17: 00,22.973,24.021
...
2015.08.10 13: 30,24.368,45.974

A08_KI_T6
08/10/2015 14: 00,24.779,41.526
...
2016.10.02 17: 012 00,22.326,41.

und es läuft korrekt, während:
inputcsvT = ['./input_csv/A08_LR_T*.csv'] sammelt
A08_LR_T5
28/05/2015 17: 00,22.493,25.62
...
08/10/2015 13:30 , 24.296,44.596

A08_LR_T6
28/05/2015 17: 00,22.493,25.62
...
2016.10.02 17: 15,21.991, 38.45
was zu einem Fehler führt.

+0

Eigentlich was versuchen Sie hier zu erreichen? Zum Beispiel, wenn du Duplikate hast, möchtest du den df der Duplikate trimmen? Sie könnten 'reset_index' aufrufen und der Aufruf' drop_duplicates' übergibt den 'index' Spaltennamen und das wird die Duplikate entfernen – EdChum

+0

Leider bekomme ich dabei den Fehler: ' KeyError "DatetimeIndex (... ...dtype = 'datetime64 [ns]', Name = u'datetime ', length = 50276, freq = None) nicht im Index "' – Andreuccio

+0

funktioniert mein Vorschlag unten? Möglicherweise müssen Sie den Indexnamen bestimmen, standardmäßig ist es' index "Aber Sie müssen vielleicht den Namen zuerst bekommen – EdChum

Antwort

2

IIUC können Sie reset_index anrufen und drop_duplicates dann und dann set_index wieder:

In [304]: 
df = pd.DataFrame(data=np.random.randn(5,3), index=list('aabcd')) 
df 

Out[304]: 
      0   1   2 
a 0.918546 -0.621496 -0.210479 
a -1.154838 -2.282168 -0.060182 
b 2.512519 -0.771701 -0.328421 
c -0.583990 -0.460282 1.294791 
d -1.018002 0.826218 0.110252 

In [308]: 
df.reset_index().drop_duplicates('index').set_index('index') 

Out[308]: 
       0   1   2 
index        
a  0.918546 -0.621496 -0.210479 
b  2.512519 -0.771701 -0.328421 
c  -0.583990 -0.460282 1.294791 
d  -1.018002 0.826218 0.110252 

EDIT

Eigentlich gibt es eine einfachere Methode ist duplicated auf dem Index zu nennen und invertieren:

In [309]: 
df[~df.index.duplicated()] 

Out[308]: 
       0   1   2 
index        
a  0.918546 -0.621496 -0.210479 
b  2.512519 -0.771701 -0.328421 
c  -0.583990 -0.460282 1.294791 
d  -1.018002 0.826218 0.110252 
+0

Ich habe versucht ' df.reset_index(). drop_duplicates ('index'). set_index ('index ') 'und erhielt den Fehler ' "ValueError: kann einen nicht eindeutigen Index mit einer Methode oder einem Limit nicht neu indizieren" ' – Andreuccio

+0

Sie haben meinen letzten Kommentar nicht beantwortet oder ob' df [~ df.index.duplicated()] 'funktioniert für Sie – EdChum

+0

EdChum, danke für das. Ich habe 'dfT [~ dfT.index.duplicated()]' und es gab den gleichen Fehler wie oben – Andreuccio