2017-03-02 2 views
2

Das folgende ist meine Daten zusammenzufassen:mit wenigen Spalten Duplikate entfernen und die anderen Spalten

name id junk date time  value value2 
abc  1 1 1/1/2017 18:07:54 5  10 
abc  1 2 1/1/2017 19:07:54 10  15 
abc  2 3 2/1/2017 20:07:54 15  20 
abc  2 4 2/1/2017 21:07:54 20  25 
def  3 5 3/1/2017 22:07:54 25  30 
def  3 6 3/1/2017 23:07:54 30  35 
def  4 7 4/1/2017 12:07:54 35  40 
def  4 8 4/1/2017 13:07:54 40  45 

I basiert die Duplikate entfernen möchten auf drei Säulen, name, id und date und nehmen den ersten Wert. Ich habe versucht, den folgenden Befehl ein:

data.drop_duplicates(subset=['name', 'id', 'date'],keep = 'first') 

ich auch gruppieren möchten diese drei Spalten und nehmen Sie die Summe von value und value2 Spalte und ich versuchte, folgende Spalte:

data[['name', 'id', 'date', 'value']].groupby(['name', 'id', 'date']).sum() 
data[['name', 'id', 'date', 'value2']].groupby(['name', 'id', 'date']).sum() 

Jetzt möchte ich alle beitreten drei Datenrahmen und nehmen Sie die Spalten. Ich denke, es sollte einen besseren Weg geben, dies zu tun? Im Folgenden ist der Ausgang ich suche:

name id junk date time  value value2 
abc  1 1 1/1/2017 18:07:54 15  25 
abc  2 3 2/1/2017 20:07:54 35  45 
def  3 5 3/1/2017 22:07:54 55  65 
def  4 7 4/1/2017 12:07:54 75  85 

Wo ich Duplikate zu prüfen, entfernen basierend auf name, id und date Spalte, nehmen Sie den ersten Wert von junk und time Spalten und fügen Sie auch die value und value2 Säulen.

Kann mir jemand dabei helfen?

Antwort

1

Sie benötigen groupby mit agg:

df = df.groupby(['name', 'id', 'date']) 
     .agg({'value':'sum', 'value2':'sum', 'time':'first', 'junk':'first'}) 
     .reset_index() 
print (df) 
    name id  date value2  time junk value 
0 abc 1 1/1/2017  25 18:07:54  1  15 
1 abc 2 2/1/2017  45 20:07:54  3  35 
2 def 3 3/1/2017  65 22:07:54  5  55 
3 def 4 4/1/2017  85 12:07:54  7  755 

Dynamische Lösung:

g_cols = ['name','id','date'] 
sum_cols = ['value','value2'] 

#remove columns in groupby and for sum 
cols = df.columns[~df.columns.isin(sum_cols + g_cols)] 
print (cols) 
Index(['junk', 'time'], dtype='object') 

#dict comprehension for sum columns 
d_sum = {col:'sum' for col in sum_cols} 
#dict comprehension for first columns 
d = {col:'first' for col in cols} 
#add dicts together 
d.update(d_sum) 
print (d) 
{'value2': 'sum', 'time': 'first', 'junk': 'first', 'value': 'sum'} 

df = df.groupby(g_cols).agg(d).reset_index() 
print (df) 
name id  date value2  time junk value 
0 abc 1 1/1/2017  25 18:07:54  1  15 
1 abc 2 2/1/2017  45 20:07:54  3  35 
2 def 3 3/1/2017  65 22:07:54  5  55 
3 def 4 4/1/2017  85 12:07:54  7  75 
+0

ich das Aggregat in zwei Spalten nur wollen und haben die ersten Werte in den verbleibenden Spalten und die verbleibenden Spalten könnte sich ändern, und außerdem gibt es in meinen aktuellen Daten fast 75 Spalten und ich muss "Zeit" angeben: "zuerst", "Junk": "zuerst" für alles. Gibt es eine Möglichkeit, dies zu vermeiden? – haimen

+0

Ja, Sie können Listenverständnis verwenden. gib mir eine Sekunde. – jezrael

+0

Bitte überprüfen Sie die bearbeitete Antwort – jezrael

Verwandte Themen