2017-02-28 3 views
0

Ich habe einen Pandas DataFrame, den ich durch eine Kombination von drei Spalten A, B, C gruppiert habe.Behalten Sie eine (invariante) Reihe von jeder Datenrahmengruppe

grouped = df.groupby(["A", "B", "C"]) 

Mehrere zusätzliche Spalten D, E, F, G (garantiert) identisch sind für alle Elemente jeder Gruppe, während die anderen Spalten X, Y innerhalb jeder Gruppe variieren. (Ich weiß bereits, welche Spalten fest sind und welche variieren.)

Ich möchte einen Datenrahmen erstellen, der eine Zeile pro Gruppe enthält und nur aus den Werten für die unveränderlichen Spalten A, B, C, D, E, F, G besteht. Was ist der einfachste Weg, dies zu tun? Da es viele identische Werte gibt, würde ich lieber angeben, welche Spalten weggelassen werden sollen, als umgekehrt.

Ich habe, indem Sie eine Zeile aus jeder Gruppe mit „Aggregation“ komme und dann die unerwünschten Spalten in einem separaten Schritt zu löschen:

thinned = grouped.aggregate(lambda x: x.iloc[0]) 
del thinned["X"], thinned["Y"] 

Der Zweck diesen die unveränderlichen Werte zu kombinieren, ist mit mehrere neue zusammenfassende Werte, die ich in einem Datenframe mit einer Zeile pro (aktueller) Gruppe berechnet habe.

thinned["newAA"] = grouped.apply(some_function) 
thinned["newBB"] = grouped.apply(other_function) 
... 

Aber ich vermute, es muss eine weniger Runde Weg sein.

+1

warum nicht nur nicht die Spalten an erster Stelle vor dem 'groupby' wählen? z.B. 'df [df.columns.difference (['X', 'Y'])]] groupby (['A', 'B', 'C'])' – EdChum

+0

Das ist eine gute Idee, aber ich muss auch zusammenführen mit einem Datenrahmen, der auf den gruppierten Spalten berechnet wird, die variieren. Es könnte also funktionieren, aber ich muss etwas mit der Indizierung umgehen. – alexis

+0

es scheint nur überflüssig zu gruppieren und dann die Spalten, die Sie nicht interessiert sind, besser, nur nicht sie vor der Operation auswählen – EdChum

Antwort

2

Sie GroupBy.first() verwenden konnte nur den ersten Datensatz jeder Gruppe auszuwählen. Zum Beispiel dieser

import pandas 

df = pandas.DataFrame({ 
    'A': [1, 1, 2, 2, 3, 3], 
    'B': [1, 1, 1, 2, 2, 2], 
    'C': [2, 2, 3, 3, 1, 1] 
}) 
print(df.groupby(['A', 'B'])['C'].first()) 

Ergebnisse in

A B 
1 1 2 
2 1 3 
    2 3 
3 2 1 
Name: C, dtype: int64 
1

Ich glaube, Sie brauchen drop_duplicates:

df = pd.DataFrame({'A':[7,4,4], 
        'B':[7,4,4], 
        'C':[7,4,4], 
        'D':[7,4,4], 
        'E':[7,4,4], 
        'F':[7,4,4], 
        'G':[7,4,4], 
        'X':[1,2,8], 
        'Y':[5,7,0]}) 

print (df) 
    A B C D E F G X Y 
0 7 7 7 7 7 7 7 1 5 
1 4 4 4 4 4 4 4 2 7 
2 4 4 4 4 4 4 4 8 0 

#filter by subset 
cols = ["A", "B", "C", "D","E","F", "G"] 
df1 = df.drop_duplicates(subset=cols)[cols] 
print (df1) 
    A B C D E F G 
0 7 7 7 7 7 7 7 
1 4 4 4 4 4 4 4 

#remove unnecessary columns 
df2 = df.drop(['X','Y'], axis=1).drop_duplicates() 
print (df2) 
    A B C D E F G 
0 7 7 7 7 7 7 7 
1 4 4 4 4 4 4 4 
1

Ich denke, man hier viele Möglichkeit haben, mehr oder weniger elegant. Vor allem, interessierst du dich für 'X' und 'Y'? Wenn Sie dies nicht tun, sind da Sie sie am Ende zu löschen können Sie einfach verwenden drop_duplicates

new_df = df[['A', 'B', 'C', 'D', 'E', 'F', 'G']].drop_duplicates() 
# this will keep only the unique values of the above columns 
Verwandte Themen