2016-09-19 4 views
1

Ich habe eine Liste, die, sagen wir mal, sieht wie folgt aus (die ich in eine DF bin setzen):Pandas: Drop quasi-Duplikate von Spaltenwerte

[ 
['john', '1', '1', '2016'], 
['john', '1', '10', '2016'], 
['sally', '3', '5', '2016'], 
['sally', '4', '1', '2016'] 
] 

columns sind ['name', 'month', 'day', 'year']

I grundsätzlich wollen Sie einen neuen DF mit nur der ältesten Zeile für jede Person ausgeben. Es sollte also zwei Zeilen enthalten, eine für John am 1/1/16 und eine für Sally am 3/5/16.

Ich hatte immer eine harte Zeit mit dieser Art von Auswahl innerhalb DF's und hoffte, dass jemand einen Ratschlag geben könnte, wie man das oben genannte erreicht.

Antwort

4

Sie können die Datenrahmen von year, month, day sortieren und dann von jedem name die erste Reihe nehmen:

df.sort_values(by = ['year', 'month', 'day']).groupby('name').first() 

# month day year 
# name   
# john 1 1 2016 
#sally 3 5 2016 

Daten:

df = pd.DataFrame([['john', '1', '1', '2016'], 
        ['john', '1', '10', '2016'], 
        ['sally', '3', '5', '2016'], 
        ['sally', '4', '1', '2016']], 
        columns = ['name', 'month', 'day', 'year']) 
0

Option 1
Verwendung pd.to_datetime analysieren ['Jahr', 'Monat', 'Tag' ] Säulen.
groupby('name') dann first

df['date'] = pd.to_datetime(df[['year', 'month', 'day']]) 
df.sort_values(['name', 'date']).groupby('name').first() 

enter image description here

Option 2
Same pd.to_datetime Nutzung nehmen.
groupby('name') nehmen Sie idxmin, um das kleinste Datum zu finden.

df['date'] = pd.to_datetime(df[['year', 'month', 'day']]) 
df.ix[df.groupby('name').date.idxmin()] 

enter image description here

+0

Sortierung nach 'name' nicht notwendig ist, ist es? –

+0

Nein, aber ich wollte die Namen zusammenhalten, wenn ich auf ein Zwischenergebnis schauen wollte. Nicht notwendig, obwohl. – piRSquared

Verwandte Themen