У меня есть фрейм данных (df), моя цель - добавить новый столбец ("grad"), который соответствует градиенту между точками, если они имеют одинаковый индекс.
Сначала я не нашел простого способа сделать это, используя только pandas, сейчас я использую numpy + pandas. Я написал функцию для получения градиента для каждой строки по группам, и она работает, но это не красиво и немного неаккуратно.
Во-вторых, я хочу добавить серию pandas массивов numpy к df, но я не знаю, как это сделать. Я попытался сложить их так, чтобы получить серию size (0,9) (grouped_2), но когда я использую concat, у меня появляется следующее сообщение: «ValueError: форма переданных значений (48, 3), индексы подразумевают (16, 3)». В соответствии с предыдущим вопросом я думаю, что наличие дублированных значений индекса является проблемой, но я не могу изменить индекс моего первого df.
df = pd.DataFrame(index = [1,1,1,1,1,2,2,2,2],
data={'value': [1,5,8,10,12,1,2,8,2], 'diff_day':[-1,0,2,3,4,-2,-1,0,10]} )
def grad(gr):
val = gr['value']
dif = gr['diff_day']
return np.gradient(val, dif)
grouped_1 = df.groupby(level=0).apply(grad)
grouped_2 = pd.DataFrame(grouped_1.values.tolist(), index=grouped_1.index).stack().reset_index(drop=True)
result = pd.concat([df, grouped_2], axis=1)
Я ожидал, что следующий фрейм данных:
pd.DataFrame(index = [1,1,1,1,1,2,2,2,2],
data={'value': [1,5,8,10,12,1,2,8,2], 'diff_day':[-1,0,2,3,4,-2,-1,0,10], 'grad':[4,3.16,1.83,2,2,1,3.5,5.4,-0.6]} )