2015-12-07 5 views
0

Suppose Ensuite, nous avons dataframe:Pandas groupe par convertir différentes lignes à une ligne avec tableau de valeurs

df = pd.DataFrame({'animal': 'cat dog cat fish dog cat cat'.split(), 
        'size': list('SSMMMLL'), 
        'weight': [8, 10, 11, 1, 20, 12, 12], 
        'adult' : [False] * 5 + [True] * 2}) 

    adult animal size weight 
0 False cat S  8 
1 False dog S  10 
2 False cat M  11 
3 False fish M  1 
4 False dog M  20 
5 True cat L  12 
6 True cat L  12 

Et je veux le convertir en la forme suivante (denormalise il) par des poids:

  weights 
animal     
cat  [8, 11, 12, 12] 
dog   [10, 20] 
fish    [1] 

Actuellement, j'utilise le code suivant:

df.groupby('animal',as_index=True).apply(lambda sf : pd.Series([list(sf['weight'])] 
,index=['weights'])) 

mais je me demande s'il existe une façon claire de le faire

Répondre

2

Ceci est juste un peu plus courte que la façon dont vous le faites, mais je suppose que vous pouvez faire:

In [22]: df.groupby('animal')['weight'].apply(list) 
Out[22]: 
animal 
cat  [8, 11, 12, 12] 
dog   [10, 20] 
fish    [1] 
Name: weight, dtype: object 

ou

In [40]: df.groupby('animal')['weight'].apply(list).to_frame() 
Out[40]: 
       weight 
animal     
cat  [8, 11, 12, 12] 
dog   [10, 20] 
fish    [1] 

La sortie fisrt un Series et le second un DataFrame.

+0

Merci pour la réponse, même si je veux aussi que la deuxième colonne ait un poids de "nom". –

+0

Voir ma modification afin de récupérer un DataFrame. – mgc

+0

Upvoted votre réponse, Merci –