#python #pandas-groupby
#питон #панды-группировка #python #pandas-groupby
Вопрос:
входной фрейм данных — >>
вывод—>>
вот как я хочу вычислить сумму. Значения в столбцах A и B могут различаться.
Я хочу объединить этот фрейм данных таким образом, чтобы для общего значения столбца A я должен был игнорировать единственное текущее значение, но должен учитывать все значения B и должен принимать сумму столбца c относительно предыдущего условия.
например- 1- для A = a и B = 1 я должен игнорировать значение столбца C для B = 1, но я должен добавить значение столбца C, где значение столбцов A == a и b!=1, а сумма должна быть 5 (2 3)
2 — для группы A = a и B = 2 я должен игнорировать B = 2, но должен учитывать, где A = a и B!= 2, поэтому для A = a и B! = 2 сумма будет равна 4 (1 3 ).
3— для группы A = a, B = 3 я должен игнорировать B = 3, но должен учитывать, где A = a и B!= 3, поэтому для A = a и B! = 3 сумма будет равна 3 (1 2).
У меня есть эта вещь для значения миллиона A, один A может иметь любое количество значений B.
Все должно быть динамичным.
Спасибо 🙂
Комментарии:
1. можете ли вы поделиться кодом, который вы написали до сих пор, для решения этой проблемы, пожалуйста
2. @JoeFerndz, я все еще ищу решение.
Ответ №1:
Вы можете сделать это с помощью простой итерации по строкам фрейма данных:
# get rows except the current show
ss['sum'] = [ss.iloc[ss.index.difference([x]),1].sum() for x in range(ss.shape[0])]
print(ss)
A B sum
0 a 1 5
1 a 2 4
2 a 3 3
Пример данных
ss = pd.DataFrame({'A': list('aaa'), 'B': [1,2,3]})
Комментарии:
1. Спасибо, @YOLO это не работает для нескольких значений столбца A, это вернет сумму полного столбца. Пока мне нужен вывод только для этой группы.
2. @NaveenRishishwar не могли бы вы отредактировать вопрос с примерами данных, в которых решение не выполняется
Ответ №2:
Вот что вы можете попробовать.
Сначала я группирую данные на основе столбца A в новый фрейм данных dfsum
Затем я преобразую столбец C в сумму. Затем вычитаем сумму из исходного столбца C, чтобы получить желаемое значение.
import pandas as pd
df = pd.DataFrame({'A': list('aaabbb'), 'B': [1,2,3,1,2,3], 'C': [1,2,3,4,5,6]})
dfsum = df.groupby(['A'])
n = dfsum['C'].transform('sum')
df['sum'] = (n - df['C'])
print (df)
Результат выглядит следующим образом:
A B C sum
0 a 1 1 5
1 a 2 2 4
2 a 3 3 3
3 b 1 4 11
4 b 2 5 10
5 b 3 6 9
Комментарии:
1. для A = b ваш вывод не соответствует ожиданиям.
2. Чего вы ожидаете,
A = b
пожалуйста .. Как я понимаю, вы ожидаете дляA = b
иB = 1
,sum
=5 6
. дляA = b
иB = 2
,sum
=4 6
. дляA = b
иB = 3
,sum
=4 5
.
Ответ №3:
У меня только что была похожая проблема. Возможно, вы решили это сейчас, но вот что я сделал. Я бы использовал функцию, которая вычисляет эту специальную сумму, которую вы описываете.
def exclusion_sum(row, df):
exclusion_mask = (df['A'] == row['A']) amp; (df['B'] != row['B'])
return df[exclusion_mask]['C'].sum() row['B']
df['sum'] = df.apply(lambda x: exclusion_sum(x, df), axis=1)