Подтвердить что ты не робот

Как суммировать значения в столбце, которые соответствуют заданному условию с помощью pandas?

Предположим, что у меня такой столбец:

a   b  
1   5   
1   7
2   3
1   3
2   5

Я хочу, например, суммировать значения для b, где a = 1. Это даст мне 5 + 7 + 3 = 15.

Как это сделать в pandas?

4b9b3361

Ответ 1

Основная идея здесь состоит в том, чтобы выбрать данные, которые вы хотите суммировать, а затем суммировать их. Этот выбор данных может быть сделан несколькими различными способами, некоторые из которых показаны ниже.

Логическое индексирование

Возможно, наиболее распространенным способом выбора значений является использование логического индексирования.

С помощью этого метода вы узнаете, где столбец "a" равен 1 а затем суммируете соответствующие строки столбца "b". Вы можете использовать loc для обработки индексации строк и столбцов:

>>> df.loc[df['a'] == 1, 'b'].sum()
15

Логическое индексирование может быть расширено на другие столбцы. Например, если df также содержит столбец "c" и мы хотим суммировать строки в "b", где "a" было 1, а "c" было 2, мы написали бы:

df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()

запрос

Другой способ выбора данных - использовать query для фильтрации интересующих вас строк, выбрать столбец "b" и затем суммировать:

>>> df.query("a == 1")['b'].sum()
15

Опять же, метод может быть расширен, чтобы сделать более сложный выбор данных:

df.query("a == 1 and c == 2")['b'].sum()

Обратите внимание, что это немного более кратко, чем метод булевой индексации.

Группа по

Альтернативный подход заключается в использовании groupby для разделения DataFrame на части в соответствии со значением в столбце "a". Затем вы можете суммировать каждую часть и извлечь значение, к которому прибавили 1 с:

>>> df.groupby('a')['b'].sum()[1]
15

Этот подход, вероятно, будет медленнее, чем использование логического индексирования, но он полезен, если вы хотите проверить суммы для других значений в столбце a:

>>> df.groupby('a')['b'].sum()
a
1    15
2     8

Ответ 2

Вы также можете сделать это без использования groupby или loc. Просто включив условие в код. Пусть имя датафрейма будет df. Тогда вы можете попробовать:

df[df['a']==1]['b'].sum()

или вы также можете попробовать:

sum(df[df['a']==1]['b'])

Другим способом может быть использование numpy библиотеки python:

import numpy as np
print(np.where(df['a']==1, df['b'],0).sum())