2017-07-19 4 views
5

Also, ich lerne Pandas und ich habe dieses Problem.Pandas Update-Spalte mit Array

Angenommen, ich habe ein Datenrahmen wie folgt aus:

A B C 
1 x NaN 
2 y NaN 
3 x NaN 
4 x NaN 
5 y NaN 

Ich versuche, diese zu erstellen:

A B C 
1 x [1,3,4] 
2 y [2,5] 
3 x [1,3,4] 
4 x [1,3,4] 
5 y [2,5] 

auf B Ähnlichkeiten Basierend.

Ich tat dies:

teste = df.groupby(['B']) 
for name,group in teste: 
    df.loc[df['B'] == name[0],'C'] = group['A'].tolist() 

Und ich habe dies. Wie die C-Spalte basiert auf A-Spalte.

A B C 
1 x 1 
2 y 2 
3 x 3 
4 x 4 
5 y 5 

Kann mir jemand erklären, warum das passiert und eine Lösung, um das so zu machen, wie ich es möchte? Thanks :)

Antwort

6

Sie die Aggregation basierend auf Spalte B tun können zunächst und dann mit original df auf B kommen zurück:

df 
# A B 
#0 1 x 
#1 2 y 
#2 3 x 
#3 4 x 
#4 5 y 

df.groupby('B').A.apply(list).rename('C').reset_index().merge(df) 

# B   C A 
#0 x [1, 3, 4] 1 
#1 x [1, 3, 4] 3 
#2 x [1, 3, 4] 4 
#3 y  [2, 5] 2 
#4 y  [2, 5] 5 
+0

läuft dies erzeugt den Fehler: Typeerror: unhashable Typ: ‚list‘ –

+0

@ E.Ducateme Sie müssen die 'C' Spalte fallen zu lassen und versuchen dies. – ayhan

+0

Eigentlich funktionierte das anstelle der anderen Lösung, die ich als Antwort markierte :) –

0
test = df.groupby('B')['A'].apply(list) 
4

könnten Sie transform verwenden, um die Listen zu erstellen.

In [324]: df['C'] = df.groupby('B')['A'].transform(lambda x: [x.values]) 

In [325]: df 
Out[325]: 
    A B   C 
0 1 x [1, 3, 4] 
1 2 y  [2, 5] 
2 3 x [1, 3, 4] 
3 4 x [1, 3, 4] 
4 5 y  [2, 5] 
+0

Arbeitete! Danke vielmals! :) –

1

Sum-Sache kreativ!
Machen Sie A einwertige Listen. Dann machen Sie eine Transformation mit sum.

df.assign(
    C=pd.Series(
     df.A.values[:, None].tolist(), df.index 
    ).groupby(df.B).transform('sum') 
) 

    A B   C 
0 1 x [1, 3, 4] 
1 2 y  [2, 5] 
2 3 x [1, 3, 4] 
3 4 x [1, 3, 4] 
4 5 y  [2, 5] 
Verwandte Themen