#python #pandas #pandas-groupby
#python #панды #pandas-groupby
Вопрос:
У меня есть фрейм данных pandas, который я хочу сгруппировать по 3 столбцам и выполнить арифметические операции для вычисления нового столбца для каждой группы. Это то, что я пробовал до сих пор:
df['c'] = df.groupby(['date', 'year', 'month']).apply(lambda x: sum(x['a']*x['weight'])/sum(x['b']*x['weight']))
но он выдает эту ошибку:
Ошибка значения: несоответствие dtype буфера, ожидаемый «объект Python», но получил «длинный» Во время обработки вышеупомянутого исключения, возникло другое исключение: ошибка типа: несовместимый индекс вставленного столбца с индексом фрейма
Я также попробовал функцию np.sum():
df['c'] = df.groupby(['date', 'year', 'month']).apply(lambda x: np.sum(x['a']*x['weight'])/np.sum(x['b']*x['weight']))
но он также выдает ту же ошибку.
Я не уверен, что это какая-то проблема с данными или моим кодом.
Любая помощь приветствуется! Спасибо!
Комментарии:
1. Можете ли вы добавить некоторый образец данных?
Ответ №1:
Я думаю, вам нужна пользовательская функция:
df = pd.DataFrame({
'date':['2010-01-01'] * 6,
'year':[2004,2005,2004,2005,2005,2004],
'month':[7] * 6,
'a':[1,3,5,7,1,0],
'b':[3,5,7,1,0,8],
'weight':[5,3,6,9,2,4],
'col':list('aaabbb')
})
def f(x):
x['c'] = (x['a']*x['weight']).sum() /(x['b']*x['weight']).sum()
return x
df = df.groupby(['date', 'year', 'month']).apply(f)
print (df)
date year month a b weight col c
0 2010-01-01 2004 7 1 3 5 a 0.393258
1 2010-01-01 2005 7 3 5 3 a 3.083333
2 2010-01-01 2004 7 5 7 6 a 0.393258
3 2010-01-01 2005 7 7 1 9 b 3.083333
4 2010-01-01 2005 7 1 0 2 b 3.083333
5 2010-01-01 2004 7 0 8 4 b 0.393258