Concat дает форму переданных значений X, индексы означают Y - PullRequest
0 голосов
/ 07 января 2020

У меня есть фрейм данных (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]} )

1 Ответ

0 голосов
/ 07 января 2020

Вот простой способ:

df['grad'] = np.gradient(df['value'], df['diff_day'])

Чтобы ваше решение работало, вы можете сделать:

result = pd.concat([df.reset_index(drop=True), grouped_2.reset_index(drop=True)], axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...