2016-05-05 19 views
1

Ich bin ein Anfänger in Pandas so bitte bitte mit mir. Ich weiß, das ist eine sehr grundlegende Frage/Pandas Dataframe groupby

Ich arbeite mit Pandas am folgenden Datenrahmen:

x  y    w 

1  2    5     
1  2    7   
3  4    3   
5  4    8  
3  4    5  
5  9    9 

Und ich mag die folgende Ausgabe:

x y w 

1 2 5,7  
3 4 2,5  
5 4 8  
5 9 9 

Kann mir jemand sagen, wie man mach es mit pandas groupby.

+0

Ist die 'w' -Spalte vom Typ string oder ist das ein Array darin? –

Antwort

1

können Sie verwenden groupby mit applyjoin:

#if type of column w is not string, convert it 
print type(df.at[0,'w']) 
<type 'numpy.int64'> 

df['w'] = df['w'].astype(str) 

print df.groupby(['x','y'])['w'].apply(','.join).reset_index() 
    x y w 
0 1 2 5,7 
1 3 4 3,5 
2 5 4 8 
3 5 9 9 

Wenn Sie Duplikate haben, drop_duplicates verwenden:

print df 
    x y w 
0 1 2 5 
1 1 2 5 
2 1 2 5 
3 1 2 7 
4 3 4 3 
5 5 4 8 
6 3 4 5 
7 5 9 9 

df['w'] = df['w'].astype(str) 
print df.groupby(['x','y'])['w'].apply(lambda x: ','.join(x.drop_duplicates())) 
     .reset_index() 

    x y w 
0 1 2 5,7 
1 3 4 3,5 
2 5 4 8 
3 5 9 9 

oder modifizierte EdChum Lösung:

print df.groupby(['x','y'])['w'].apply(lambda x: ','.join(x.astype(str).drop_duplicates())) 
     .reset_index() 

    x y w 
0 1 2 5,7 
1 3 4 3,5 
2 5 4 8 
3 5 9 9 
+0

Danke! Das funktioniert. Aber das wiederholt Werte. Wenn ich dieselben Werte für w für dasselbe (x, y) habe, wiederholt es den Wert in der Ausgabe. Wie kann ich damit umgehen? – user324

+0

Siehe Bearbeiten. Ich füge Lösung hinzu. – jezrael

+0

Es funktioniert. Vielen Dank! – user324

1

Sie können groupby auf Spalten 'x' und 'y' und eine Lambda auf der 'w' Spalte anwenden, wenn Sie benötigt, um die dtype mit astype würfen

In [220]: 
df.groupby(['x','y'])['w'].apply(lambda x: ','.join(x.astype(str))) 

Out[220]: 
x y 
1 2 5,7 
3 4 3,5 
5 4  8 
    9  9 
Name: w, dtype: object 

In [221]: 
df.groupby(['x','y'])['w'].apply(lambda x: ','.join(x.astype(str))).reset_index() 

Out[221]: 
    x y w 
0 1 2 5,7 
1 3 4 3,5 
2 5 4 8 
3 5 9 9 

EDIT

auf dem modifizierten Beispiel:

In [237]: 
df.groupby(['x','y'])['w'].apply(lambda x: ','.join(x.unique().astype(str))).reset_index() 

Out[237]: 
    x y w 
0 1 2 5,7 
1 3 4 3,5 
2 5 4 8 
3 5 9 9 
+0

Danke! Das funktioniert. Aber das wiederholt Werte. Wenn ich dieselben Werte für w für dasselbe (x, y) habe, wiederholt es den Wert in der Ausgabe. Wie kann ich damit umgehen? – user324

+0

Die normale Etikette hier ist, Beispieldaten zu veröffentlichen, die für Ihr Problem repräsentativ sind, iterativ zu erhöhen oder neue Informationen hinzuzufügen, nachdem Leute geantwortet haben, ist kontraproduktiv und ärgerlich – EdChum