Tengo unos pandas DataFrame
como los siguientes.
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"]})
Quiero agrupar esto por ["id", "valor"] y obtener la primera fila de cada grupo.
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
Gastos esperados
id value
1 first
2 first
3 first
4 second
5 first
6 first
7 fourth
Intenté seguir lo que solo da la primera fila de DataFrame
. Cualquier ayuda con respecto a esto es apreciada.
In [25]: for index, row in df.iterrows():
....: df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])
first()
con respecto a nans es muy sorprendente y es algo que creo que la mayoría de la gente no esperará.Respuestas:
Si necesitas
id
como columna:Para obtener n primeros registros, puede usar head ():
fuente
tail(n)
(el valor predeterminado es n = 5) ( ref. ). No debe confundirse conlast()
, cometí ese error.groupby('id',as_index=False)
también se mantieneid
como una columnaEsto le dará la segunda fila de cada grupo (cero indexado, nth (0) es lo mismo que first ()):
Documentación: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group
fuente
nth((0,1,2))
onth(range(3))
.TypeError: n needs to be an int or a list/set/tuple of ints
range(3)
no devuelve una lista a menos que escribalist(range(3))
.Sugeriría usar en
.nth(0)
lugar de.first()
si necesita obtener la primera fila.La diferencia entre ellos es cómo manejan los NaN, por
.nth(0)
lo que devolverá la primera fila del grupo sin importar cuáles sean los valores en esta fila, mientras.first()
que eventualmente devolverá el primer valor noNaN
en cada columna.Por ejemplo, si su conjunto de datos es:
Y
fuente
.head(1)
también parece comportarse como.nth(0)
, excepto por el índicetal vez esto es lo que quieres
fuente
Si solo necesita la primera fila de cada grupo con el que podemos hacerlo
drop_duplicates
, observe el método predeterminado de la funciónkeep='first'
.fuente