web-dev-qa-db-fra.com

Pandas dataframe obtient la première ligne de chaque groupe

J'ai un pandas DataFrame comme suit.

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4,5,6,6,6,7,7],
                'value'  : ["first","second","second","first",
                            "second","first","third","fourth",
                            "fifth","second","fifth","first",
                            "first","second","third","fourth","fifth"]})

Je veux grouper ceci par ["id", "valeur"] et obtenir la première ligne de chaque groupe.

        id   value
0        1   first
1        1  second
2        1  second
3        2   first
4        2  second
5        3   first
6        3   third
7        3  fourth
8        3   fifth
9        4  second
10       4   fifth
11       5   first
12       6   first
13       6  second
14       6   third
15       7  fourth
16       7   fifth

Résultat attendu

    id   value
     1   first
     2   first
     3   first
     4  second
     5  first
     6  first
     7  fourth

J'ai essayé de suivre ce qui ne donne que la première ligne de la DataFrame. Toute aide à ce sujet est appréciée.

In [25]: for index, row in df.iterrows():
   ....:     df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])
102
Nilani Algiriyage
>>> df.groupby('id').first()
     value
id        
1    first
2    first
3    first
4   second
5    first
6    first
7   fourth

Si vous avez besoin de id comme colonne:

>>> df.groupby('id').first().reset_index()
   id   value
0   1   first
1   2   first
2   3   first
3   4  second
4   5   first
5   6   first
6   7  fourth

Pour obtenir n premiers enregistrements, vous pouvez utiliser head ():

>>> df.groupby('id').head(2).reset_index(drop=True)
    id   value
0    1   first
1    1  second
2    2   first
3    2  second
4    3   first
5    3   third
6    4  second
7    4   fifth
8    5   first
9    6   first
10   6  second
11   7  fourth
12   7   fifth
186
Roman Pekar

Cela vous donnera la deuxième ligne de chaque groupe (zéro indexé, nth (0) est identique à first ()):

df.groupby('id').nth(1) 

Documentation: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group

43
wij

Je suggérerais d'utiliser .nth(0) plutôt que .first() si vous devez obtenir la première ligne.

La différence entre eux réside dans la façon dont ils gèrent les NaN. Ainsi, .nth(0) renvoie la première ligne du groupe, quelles que soient les valeurs de cette ligne, tandis que .first() renvoie finalement la première pas NaN valeur dans chaque colonne.

Par exemple. si votre jeu de données est:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4],
            'value'  : ["first","second","third", np.NaN,
                        "second","first","second","third",
                        "fourth","first","second"]})

>>> df.groupby('id').nth(0)
    value
id        
1    first
2    NaN
3    first
4    first

Et

>>> df.groupby('id').first()
    value
id        
1    first
2    second
3    first
4    first
20
vital_dml

c'est peut-être ce que tu veux

import pandas as pd
idx = pd.MultiIndex.from_product([['state1','state2'],   ['county1','county2','county3','county4']])
df = pd.DataFrame({'pop': [12,15,65,42,78,67,55,31]}, index=idx)
                pop
state1 county1   12
       county2   15
       county3   65
       county4   42
state2 county1   78
       county2   67
       county3   55
       county4   31
df.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values('pop', ascending=False)).groupby(level=0).head(3)

> Out[29]: 
                pop
state1 county3   65
       county4   42
       county2   15
state2 county1   78
       county2   67
       county3   55
5
Siraj S.

Si vous n'avez besoin que de la première ligne de chaque groupe, nous pouvons utiliser drop_duplicates , notez la fonction default method _keep='first'_.

_df.drop_duplicates('id')
Out[1027]: 
    id   value
0    1   first
3    2   first
5    3   first
9    4  second
11   5   first
12   6   first
15   7  fourth
_
2
WeNYoBen