Панды группируются и выполняют арифметические операции

#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