2016-12-21 4 views
1

Ich fragte vor kurzem eine Frage Merge pandas dataframe on time and another column über das Zusammenführen von Datenrahmen und bekam eine hervorragende, einzeilige Antwort, die perfekt mit meinen Testdaten funktionierte. Allerdings, wenn ich es in meine eigentlichen Daten zu setzen versuchte, bekam ich folgende Fehlermeldung:Pandas Merge Fehler: kann nicht von einer doppelten Achse neuindizieren

cannot reindex from a duplicate axis

Hier ist ein Teil des Codes aus dieser Frage (mit einer geringfügigen Änderung überlappende Zeitstempel zu zeigen):

a = {'date':['1/1/2015 00:00','1/1/2015 00:15','1/1/2015 00:30'], 'num':[1,2,3]} 
b = {'date':['1/1/2015 00:15','1/1/2015 00:30','1/1/2015 00:45'], 'num':[4,5,6]} 

dfa = pd.DataFrame(a) 
dfb = pd.DataFrame(b) 

dfa['date'] = dfa['date'].apply(pd.to_datetime) 
dfb['date'] = dfb['date'].apply(pd.to_datetime) 

und die Lösung:

dfa.set_index('date').combine_first(dfb.set_index('date')).asfreq('15T').reset_index() 

der obige Code (mit einfachen Daten) wirkt wie ein Zauber, aber wenn jemand weiß, was könnte falsch Witz gehen h mein Code in der Produktion, lass es mich wissen. Vielen Dank.

Und ja, es gibt ähnliche Fragen zu SO, aber ich habe keine gefunden, die damit zu tun haben, dass es inhärente Duplikate in den Indizes geben wird und ich möchte, dass der eine den anderen überschreibt.

+1

haben Sie dupliziere Daten mit 'dfa' an sich? Oder 'dfb' an sich? Wenn ja, möchtest du den ersten behalten? – piRSquared

+0

@piRSquared - Ich glaube nicht, dass es Duplikate in 'dfa' oder' dfb' gibt, aber überprüfen kann. Vielen Dank. – pshep123

Antwort

2

Problem ist Ihre Daten Duplikate in name in dfa oder dfb (vielleicht beides), können Sie es durch Probe simulieren:

a = {'date':['1/1/2015 00:00','1/1/2015 00:00','1/1/2015 00:30'], 'num':[1,2,3]} 
b = {'date':['1/1/2015 00:15','1/1/2015 00:30','1/1/2015 00:45'], 'num':[4,5,6]} 

dfa = pd.DataFrame(a) 
dfb = pd.DataFrame(b) 

dfa['date'] = pd.to_datetime(dfa['date']) 
dfb['date'] = pd.to_datetime(dfb['date']) 

print (dfa) 
       date num 
0 2015-01-01 00:00:00 1 
1 2015-01-01 00:00:00 2 
2 2015-01-01 00:30:00 3 

Und Lösung ist Duplikate entfernen:

#keep first duplicates, by default 
dfa = dfa.drop_duplicates('date') 
print (dfa) 
       date num 
0 2015-01-01 00:00:00 1 
2 2015-01-01 00:30:00 3 

#keep last duplicates 
dfa = dfa.drop_duplicates('date', keep='last') 
print (dfa) 
       date num 
1 2015-01-01 00:00:00 2 
2 2015-01-01 00:30:00 3 
+0

Sie zeigen ein Duplikat in "a", wo ich nicht war. Aber vielleicht hast du etwas vor. Ich muss mich in die Daten vertiefen. Vielen Dank. – pshep123

+0

Sie können es esy testen, indem Sie 'print (dfa.date.unique()) print (dfb.date.unique()) ' – jezrael

+0

ich es sehe, aber numpy ist schwer für mich (ich habe keine Ahnung, Warum ist das Timing anders? Ich denke du kannst auf einen Guru wie Divakar warten. ;) – jezrael

Verwandte Themen