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])
>>> 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
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
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
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
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
_