Pandas dataframe - суммировать столбец со значениями в другом столбце

У меня есть данные, которые выглядят так: -

data = {"doc1" : {'a': 2 , 'b': 1,'c':3}, "doc2" :  {'a': 1 , 'b': 1,'c':3}, "doc3" : {'a': 1 , 'b': 1,'c':3}}

Я конвертирую его в фрейм данных: -

df = pd.DataFrame.from_dict(data,orient='index')

Датафрейм выглядит так: -

a c b doc1 2 3 1 doc2 1 3 1 doc3 1 3 1

Теперь я хочу суммировать все значения в столбце b, где значения столбца a равны 1.

Таким образом, значение, которое я хочу, будет 2.

Есть ли простой способ сделать это, а не перебирать оба столбца? Я проверил другие сообщения и нашел это: -

Это использует функцию .loc. df.loc[df['a'] == 1, 'b'].sum()

Но по какой-то причине я не могу заставить его работать с моим фреймворком данных.

Пожалуйста, дай мне знать.

Спасибо.


person skyfail    schedule 30.11.2016    source источник
comment
Но по какой-то причине я не могу заставить его работать с моим фреймворком данных. Не могли бы вы дать подробное описание какой-либо причины? Ответ, который вы найдете, должен работать.   -  person seven7e    schedule 30.11.2016
comment
Эй, я заставил это работать с ответом ниже. Но мой код также делал то же самое. Только я перепутал переменные. Из-за этого он терпел неудачу. Благодаря тонну !!   -  person skyfail    schedule 02.12.2016


Ответы (1)


Вы очень близки. Смотри ниже.

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

Вместо использования .loc попробуйте сначала отфильтровать фрейм данных (df[df['a'] == 1]), затем выбрать столбец 'b', а затем суммировать.

Изменить: я оставлю это здесь для дальнейшего использования, хотя в зависимости от версии панд, которую вы используете, ваше решение должно работать (спасибо, @maxymoo). Я использую 0.18.1, и оба подхода сработали.

person blacksite    schedule 30.11.2016
comment
на самом деле это должно быть эквивалентно коду ОП ... хотя, может быть, это только в последней версии панд? - person maxymoo; 30.11.2016
comment
Хм. Ты прав. Я запускаю pandas 0.18.1, и его решение все еще работает. - person blacksite; 30.11.2016
comment
Эй, спасибо за быстрый ответ. Я попробовал код, и он отлично работает, но мой фреймворк данных довольно огромен: 10 000 столбцов и более 2 000 строк. Мне нужно вычислить сумму много раз. Когда я использовал приведенный выше код, это заняло много времени. Есть ли более быстрый способ сделать это? - person skyfail; 30.11.2016
comment
Это почти другая проблема. Сколько различных значений вы пытаетесь отфильтровать? Сколько столбцов вы пытаетесь суммировать? Приведенный выше пример должен выполняться очень быстро, имея всего 2 тыс. строк и фильтр с одним столбцом. Похоже, метод groupby - это то, что вы ищете. - person blacksite; 30.11.2016
comment
Я делаю то же самое, что я упомянул выше, но в большем масштабе. Проходя через 2k строк и перебирая все столбцы, которые похожи на 30k, но рассматривая только один столбец за раз по отношению к другому столбцу. - person skyfail; 30.11.2016
comment
Какова цель вашего анализа? Судя по вашим меткам doc1, doc2 и т. д., вы проводите своего рода анализ текста, используя частотность слов. Если да, могу ли я предложить sklearn.feature_extraction.text.CountVectorizer? Поскольку это возвращает пустой массив, вы сможете выполнять эти суммы намного быстрее. - person blacksite; 30.11.2016