J'ai un pandas DataFrame
comme le suivant.
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 regrouper cela par ["id", "value"] 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 du fichier 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])
first()
par rapport à nans est très surprenant et je pense que la plupart des gens ne s'y attendront pas.Réponses:
Si vous avez besoin
id
comme colonne:Pour obtenir n premiers enregistrements, vous pouvez utiliser head ():
la source
tail(n)
(la valeur par défaut est n = 5) ( réf. ). À ne pas confondrelast()
, j'ai commis cette erreur.groupby('id',as_index=False)
garde aussiid
comme colonneCela vous donnera la deuxième ligne de chaque groupe (zéro indexé, nième (0) est le même que first ()):
Documentation: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group
la source
nth((0,1,2))
ounth(range(3))
.TypeError: n needs to be an int or a list/set/tuple of ints
range(3)
ne renvoie pas de liste sauf si vous tapezlist(range(3))
.Je suggère d'utiliser
.nth(0)
plutôt que.first()
si vous avez besoin d'obtenir la première ligne.La différence entre eux est la façon dont ils gèrent les NaN, donc
.nth(0)
retournera la première ligne du groupe quelles que soient les valeurs de cette ligne, alors que.first()
finira par retourner la première nonNaN
valeur dans chaque colonne .Par exemple, si votre ensemble de données est:
Et
la source
.head(1)
semble également se comporter comme.nth(0)
, sauf pour l'indexc'est peut-être ce que tu veux
la source
Si vous n'avez besoin que de la première ligne de chaque groupe avec
drop_duplicates
lequel nous pouvons faire , notez la méthode par défaut de la fonctionkeep='first'
.la source