Предположим, что у меня такой столбец:
a b
1 5
1 7
2 3
1 3
2 5
Я хочу, например, суммировать значения для b
, где a = 1
. Это даст мне 5 + 7 + 3 = 15
.
Как это сделать в pandas?
Предположим, что у меня такой столбец:
a b
1 5
1 7
2 3
1 3
2 5
Я хочу, например, суммировать значения для b
, где a = 1
. Это даст мне 5 + 7 + 3 = 15
.
Как это сделать в pandas?
Основная идея здесь состоит в том, чтобы выбрать данные, которые вы хотите суммировать, а затем суммировать их. Этот выбор данных может быть сделан несколькими различными способами, некоторые из которых показаны ниже.
Возможно, наиболее распространенным способом выбора значений является использование логического индексирования.
С помощью этого метода вы узнаете, где столбец "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
Вы также можете сделать это без использования 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())