首页 > 解决方案 > GroupBy 和 Transform 不会保留数据框的所有列

问题描述

假设我有以下数据集:

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

所以它给了我改变的值,但它不保留数据框的所有列。

我如何还保留数据框的所有列以及移动一列的值?

标签: pythonpandas

解决方案


您可以通过以下方式简化解决方案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

推荐阅读