GroupBy и Transform не сохраняют все столбцы фрейма данных

#python #pandas

#python #pandas

Вопрос:

Давайте предположим, что у меня есть следующий набор данных:

 Stock_id    Week    Stock_value
1   1   2
1   2   4
1   4   7
1   5   1
2   3   8
2   4   6
2   5   5
2   6   3
  

Я хочу сдвинуть значения Stock_value столбца на одну позицию, чтобы получить следующее:

 Stock_id    Week    Stock_value
1   1   NA
1   2   2
1   4   4
1   5   7
2   3   NA
2   4   8
2   5   6
2   6   5
  

Что я делаю, так это следующее:

 df = pd.read_csv('C:/Users/user/Desktop/test.txt', keep_default_na=True, sep='t')

df = df.groupby('Store_id', as_index=False)['Waiting_time'].transform(lambda x:x.shift(periods=1))
  

Но тогда это дает мне:

    Waiting_time
0           NaN
1           2.0
2           4.0
3           7.0
4           NaN
5           8.0
6           6.0
7           5.0
  

Таким образом, это дает мне смещенные значения, но не сохраняет все столбцы фрейма данных.

Как мне также сохранить все столбцы фрейма данных вместе со сдвигом значений одного столбца?

Комментарии:

1. Необходимо df['new col'] = df.groupby('Store_id...

Ответ №1:

Вы можете упростить решение, DataFrameGroupBy.shift и назначить обратно новому столбцу:

 df['Waiting_time'] = df.groupby('Stock_id')['Stock_value'].shift()
  

Работает так же, как:

 df['Waiting_time']=df.groupby('Stock_id')['Stock_value'].transform(lambda x:x.shift(periods=1))

print (df)
   Stock_id  Week  Stock_value  Waiting_time
0         1     1            2           NaN
1         1     2            4           2.0
2         1     4            7           4.0
3         1     5            1           7.0
4         2     3            8           NaN
5         2     4            6           8.0
6         2     5            5           6.0
7         2     6            3           5.0
  

Комментарии:

1. Хорошо, это работает, и для меня это даже лучше (проголосовать). Спасибо. Однако, честно говоря, меня немного смущает, сохраняются ли столбцы после использования .transform , .apply() … на мой взгляд, каждый раз, когда происходит что-то другое … ха-ха…

2. @PoeteMaudit — да, если проверить документы по преобразованию , то есть некоторые must , поэтому должна быть некоторая разница, если использовать некоторые пользовательские функции.

Ответ №2:

Когда вы это делаете df.groupby('Store_id', as_index=False)['Waiting_time'] , вы получаете фрейм данных с одним столбцом ‘Waiting_time’, вы не можете сгенерировать из него другие столбцы.

Как предложил джезраэль в комментарии, вы должны сделать

 df['new col'] = df.groupby('Store_id...
  

чтобы добавить этот новый столбец к вашему ранее существующему фрейму данных.