Проверьте один столбец со строками и получите сумму значений из второго столбца (питоновский способ)

Учитывая этот фрейм данных:

d = {'SITE':['AB', 'ON', 'YO', 'YO', 'AB'],
 'MARK':['ss', 'ss', 'tt', 'ss', 'tt'], 
 'SIZE': [4, 5, 2, 3, 4]} 

ex_df = pd.DataFrame(data=d) 

Проверьте один столбец со строками и получите сумму значений из второго столбца (питоновский способ)

Чтобы получить column['SIZE'] сумму только за column['SITE'] == 'AB' можно разрезать AB, содержащий только df, использует AB_df = ex_df[ex_df.SITE == 'AB'], а затем AB_df.SIZE.sum(), то есть 8.

Однако, учитывая аналогичный фрейм данных с более чем 10 000 строк и 12 столбцов и более 40 уникальных строк column['SITE'].

Q1: Как вы можете получить сумму SIZE для каждого SITE, не написав 40 строк того же кода, что и выше (изменив имя SITE).

Q2: Как вы можете добавить дополнительные условия, например проверить, что если условие соответствует двум столбцам, SITE & MARK, а затем получить сумму SIZE, без необходимости снова писать 40 строк повторяющегося кода.

Я хотел бы сохранить результат либо в списке, содержащем суммы, либо в словаре с сайтом и суммой {AB:8, ON:5, ...}, либо даже в новом фрейме данных с этой информацией.

Я пытался использовать list из 40 unique sites для итерации по столбцу фрейма данных, но безуспешно, учитывая разницу в длине и т. д.

Я хочу сделать этот pythonic идеальным. Спасибо!

🤔 А знаете ли вы, что...
В Python есть среды разработки, такие как Jupyter Notebook, которые упрощают работу с данными и исследованиями.


33
2

Ответы:

Решено

Q1 Может быть выполнено с помощью groupby в Pandas:

grouped_df = ex_df.groupby('SITE').agg({'SIZE': 'sum'}

Чтобы выполнить Q2, вам, вероятно, потребуется реализовать пользовательскую функцию для перехода к вызову .agg, например:

def my_filter(df: pd.Dataframe):
    # Filters can be modified as needed
    return df[df['SITE'].startswith('A') & df['MARK'] == 'tt']['SIZE'].sum()

grouped_df = ex_df.groupby('SITE').agg(my_filter)

Однако, если ваша цель для Q2 – просто сгруппировать строки по SITE И MARK, вы можете сделать следующее:

grouped_df = ex_df.groupby(['SITE', 'MARK']).agg({'SIZE': 'sum'})

Тогда вам не придется беспокоиться о написании пользовательской функции фильтрации.


IIUC это должно дать вам сумму каждого САЙТА для каждой строки:

ex_df['Max'] = ex_df.groupby(['SITE'])['SIZE'].transform(sum)

Если нет, пожалуйста, уточните для получения дополнительной помощи.