2016-11-04 5 views
5

Geben Sie die folgende dfNeue Spalte in der Pandas - Serie Zugabe durch Anlegen einer Liste groupby zu Datenrahmen

Id other concat 
0 A  z  1 
1 A  y  2 
2 B  x  3 
3 B  w  4 
4 B  v  5 
5 B  u  6 

ich das Ergebnis mit new Spalte mit gruppierten Werte als Liste

wollen
Id other concat   new 
0 A  z  1  [1, 2] 
1 A  y  2  [1, 2] 
2 B  x  3 [3, 4, 5, 6] 
3 B  w  4 [3, 4, 5, 6] 
4 B  v  5 [3, 4, 5, 6] 
5 B  u  6 [3, 4, 5, 6] 

Dies ist ähnlich auf diese Fragen:

grouping rows in list in pandas groupby

Replicating GROUP_CONCAT for pandas.DataFrame

Es ist jedoch die Anwendung Gruppierung Sie von df.groupby('Id')['concat'].apply(list) erhalten, die eine Series von geringerer Größe als der Datenrahmen ist, auf den ursprünglichen Datenrahmen.

Ich habe den Code unten versucht, aber es dies auf den Datenrahmen nicht gilt:

import pandas as pd 
df = pd.DataFrame({'Id':['A','A','B','B','B','C'], 'other':['z','y','x','w','v','u'], 'concat':[1,2,5,5,4,6]}) 
df.groupby('Id')['concat'].apply(list) 

Ich weiß, dass transform kann verwendet werden, Gruppierungen Datenrahmen anzuwenden, aber es funktioniert nicht in diesem Fall.

>>> df['new_col'] = df.groupby('Id')['concat'].transform(list) 
>>> df 
    Id concat other new_col 
0 A  1  z  1 
1 A  2  y  2 
2 B  5  x  5 
3 B  5  w  5 
4 B  4  v  4 
5 C  6  u  6 
>>> df['new_col'] = df.groupby('Id')['concat'].apply(list) 
>>> df 
    Id concat other new_col 
0 A  1  z  NaN 
1 A  2  y  NaN 
2 B  5  x  NaN 
3 B  5  w  NaN 
4 B  4  v  NaN 
5 C  6  u  NaN 

Antwort

4

groupby mit join

df.join(df.groupby('Id').concat.apply(list).to_frame('new'), on='Id') 

enter image description here

3

Weniger elegant (und langsamer ..) Lösung, aber lassen Sie es als Alternative hier gerade sein.

def func(gr): 
    gr['new'] = [list(gr.concat)] * len(gr.index) 
    return gr 
df.groupby('Id').apply(func) 

%timeit df.groupby('Id').apply(func) 
100 loops, best of 3: 4.18 ms per loop 

%timeit df.join(df.groupby('Id').concat.apply(list).to_frame('new'), on='Id') 
1000 loops, best of 3: 1.69 ms per loop 
1

Verwenden transform mit [x.tolist()] oder [x.values]

In [1396]: df.groupby('Id')['concat'].transform(lambda x: [x.tolist()]) 
Out[1396]: 
0   [1, 2] 
1   [1, 2] 
2 [3, 4, 5, 6] 
3 [3, 4, 5, 6] 
4 [3, 4, 5, 6] 
5 [3, 4, 5, 6] 
Name: concat, dtype: object 

In [1397]: df['new'] = df.groupby('Id')['concat'].transform(lambda x: [x.tolist()]) 

In [1398]: df 
Out[1398]: 
    Id other concat   new 
0 A  z  1  [1, 2] 
1 A  y  2  [1, 2] 
2 B  x  3 [3, 4, 5, 6] 
3 B  w  4 [3, 4, 5, 6] 
4 B  v  5 [3, 4, 5, 6] 
5 B  u  6 [3, 4, 5, 6] 
Verwandte Themen