Les Pandas dataframe obtenir la première ligne de chaque groupe
J'ai une 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 du groupe par cette ["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 concernant ce qui est apprécié.
In [25]: for index, row in df.iterrows():
....: df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])
- Je me rends compte de cette question est assez vieux, mais je vous suggère d'accepter la réponse de @vital_dml car le comportement de
first()
à l'égard de nans est très surprenant et quelque chose que je pense que la plupart des gens ne s'attendent pas.
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin d'
id
comme colonne:Pour obtenir les n premiers enregistrements, vous pouvez utiliser de la tête():
tail(n)
(par défaut n=5) (réf.). À ne pas confondre aveclast()
, j'ai fait cette erreur.groupby('id',as_index=False)
conserve égalementid
comme une colonneCela vous donnera la deuxième ligne de chaque groupe (zéro indexés, nth(0) est la même que la première()):
Documentation: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group
nth((0,1,2))
ounth(range(3))
.TypeError: n needs to be an int or a list/set/tuple of ints
range(3)
ne retourne pas une liste, sauf si vous tapezlist(range(3))
.Je vous suggère d'utiliser
.nth(0)
plutôt que.first()
si vous avez besoin pour obtenir la première ligne.La différence entre eux est de savoir comment ils gèrent les NaNs, donc
.nth(0)
sera de retour sur la première ligne de groupe, peu importe quelles sont les valeurs de cette ligne, tandis que les.first()
finira par retourner la première pasNaN
valeur dans chaque colonne.E. g. si votre jeu de données est :
Et
.head(1)
semble également se comporter comme.nth(0)
, sauf pour l'indicec'est peut-être ce que vous voulez
Si vous avez uniquement besoin de la première ligne de chaque groupe, nous pouvons le faire avec
drop_duplicates
, un Avis à la fonction par défaut de la méthodekeep='first'
.