El paso a paso o código que verás en este artículo es la solución más fácil y efectiva que encontramos a esta inquietud o problema.
Solución:
Primer grupo por la columna key1:
In [11]: g = df.groupby('key1')
y luego, para cada grupo, tome el subDataFrame donde key2 es igual a ‘uno’ y sume la columna data1:
In [12]: g.apply(lambda x: x[x['key2'] == 'one']['data1'].sum())
Out[12]:
key1
a 0.093391
b 1.468194
dtype: float64
Para explicar lo que está pasando, veamos el grupo ‘a’:
In [21]: a = g.get_group('a')
In [22]: a
Out[22]:
data1 data2 key1 key2
0 0.361601 0.375297 a one
1 0.069889 0.809772 a two
4 -0.268210 1.250340 a one
In [23]: a[a['key2'] == 'one']
Out[23]:
data1 data2 key1 key2
0 0.361601 0.375297 a one
4 -0.268210 1.250340 a one
In [24]: a[a['key2'] == 'one']['data1']
Out[24]:
0 0.361601
4 -0.268210
Name: data1, dtype: float64
In [25]: a[a['key2'] == 'one']['data1'].sum()
Out[25]: 0.093391000000000002
Puede ser un poco más fácil/claro hacer esto restringiendo el marco de datos solo a aquellos con key2 igual a uno primero:
In [31]: df1 = df[df['key2'] == 'one']
In [32]: df1
Out[32]:
data1 data2 key1 key2
0 0.361601 0.375297 a one
2 1.468194 0.272929 b one
4 -0.268210 1.250340 a one
In [33]: df1.groupby('key1')['data1'].sum()
Out[33]:
key1
a 0.093391
b 1.468194
Name: data1, dtype: float64
Creo que hoy con pandas 0.23 puedes hacer esto:
import numpy as np
df.assign(result = np.where(df['key2']=='one',df.data1,0))
.groupby('key1').agg('result':sum)
La ventaja de esto es que puede aplicarlo a más de una columna del mismo marco de datos
df.assign(
result1 = np.where(df['key2']=='one',df.data1,0),
result2 = np.where(df['key2']=='two',df.data1,0)
).groupby('key1').agg('result1':sum, 'result2':sum)
Eres capaz de patrocinar nuestro trabajo ejecutando un comentario y dejando una puntuación te damos las gracias.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)