python - print - ¿Cómo sumo valores en una columna que coincida con una condición dada usando pandas?
pandas python tutorial español (2)
Supongamos que tengo una columna como esta:
a b
1 5
1 7
2 3
1 3
2 5
Quiero resumir los valores de
b
donde
a = 1
, por ejemplo.
Esto me daría
5 + 7 + 3 = 15
.
¿Cómo hago esto en pandas?
La idea esencial aquí es seleccionar los datos que desea sumar y luego sumarlos. Esta selección de datos se puede hacer de varias maneras diferentes, algunas de las cuales se muestran a continuación.
Indexación booleana
Podría decirse que la forma más común de seleccionar los valores es usar la indexación booleana .
Con este método, descubres dónde la columna ''a'' es igual a
1
y luego sumas las filas correspondientes de la columna ''b''.
Puede usar
loc
para manejar la indexación de filas y columnas:
>>> df.loc[df[''a''] == 1, ''b''].sum()
15
La indexación booleana se puede extender a otras columnas.
Por ejemplo, si
df
también contenía una columna ''c'' y queríamos sumar las filas en ''b'' donde ''a'' era 1 y ''c'' era 2, escribiríamos:
df.loc[(df[''a''] == 1) & (df[''c''] == 2), ''b''].sum()
Consulta
Otra forma de seleccionar los datos es usar la
query
para filtrar las filas que le interesan, seleccionar la columna ''b'' y luego sumar:
>>> df.query("a == 1")[''b''].sum()
15
Nuevamente, el método puede extenderse para hacer selecciones más complicadas de los datos:
df.query("a == 1 and c == 2")[''b''].sum()
Tenga en cuenta que esto es un poco más conciso que el enfoque de indexación booleana.
Agrupar por
El enfoque alternativo es usar
groupby
para dividir el DataFrame en partes de acuerdo con el valor en la columna ''a''.
Luego puede sumar cada parte y extraer el valor que sumaron los 1:
>>> df.groupby(''a'')[''b''].sum()[1]
15
Es probable que este enfoque sea más lento que usar la indexación booleana, pero es útil si desea verificar las sumas para otros valores en la columna
a
:
>>> df.groupby(''a'')[''b''].sum()
a
1 15
2 8
También puede hacer esto sin usar groupby o loc. Simplemente incluyendo la condición en el código. Deje que el nombre del marco de datos sea df. Entonces puedes probar:
df[df[''a'']==1][''b''].sum()
o también puedes probar:
sum(df[df[''a'']==1][''b''])
Otra forma podría ser usar la biblioteca numpy de python:
import numpy as np
print(np.where(df[''a'']==1, df[''b''],0).sum())