pandas groupby с условием исключения внутри группы

#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)