#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...
чтобы добавить этот новый столбец к вашему ранее существующему фрейму данных.