Учитывая этот фрейм данных:
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, которые упрощают работу с данными и исследованиями.
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'})
Тогда вам не придется беспокоиться о написании пользовательской функции фильтрации.