GroupBy和Transform不会保留数据框的所有列

时间:2019-03-04 10:14:51

标签: 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

因此,它为我提供了已移位的值,但并不能保留数据帧的所有列。

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

2 个答案:

答案 0 :(得分:2)

您可以通过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 :(得分:2)

当您执行df.groupby('Store_id', as_index=False)['Waiting_time']时,获得的数据帧只有一列“ Waiting_time”,您将无法从中生成其他列。

jezrael在评论中建议,您应该这样做

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

将此新列添加到以前存在的DataFrame中。