我今天here提出了类似的问题,我认为将其应用于组很容易,但是我发现这比我想象的要难。
所以,假设这是我的DataFrame:
group a b
0 0 'a' 3
1 0 'a' 56
2 0 'b' 7
3 0 'b' 80
4 0 'b' 55
5 0 'f' 601
6 0 'f' -4
7 0 'g' 33
8 0 'g' 22
9 1 'a' 3
10 1 'a' 56
11 1 'b' 7
12 1 'b' 80
13 1 'b' 55
14 1 'f' 601
15 1 'f' -4
16 1 'g' 33
17 1 'g' 22
我想创建一个新列c
,其中的值将是同一组中b
的上一个值a
中最后一个值 group a b c
0 0 'a' 3 nan
1 0 'a' 56 nan
2 0 'b' 7 56
3 0 'b' 80 56
4 0 'b' 55 56
5 0 'f' 601 55
6 0 'f' -4 55
7 0 'g' 33 -4
8 0 'g' 22 -4
9 1 'a' 3 nan
10 1 'a' 56 nan
11 1 'b' 7 56
12 1 'b' 80 56
13 1 'b' 55 56
14 1 'f' 601 55
15 1 'f' -4 55
16 1 'g' 33 -4
17 1 'g' 22 -4
,因此输出应为:
{{1}}
任何帮助将不胜感激!
答案 0 :(得分:1)
如果您的数据没有重复的索引,这将起作用:
groups = df.groupby('group')
df['c'] = df.loc[df['a']!=groups['a'].shift(-1),'b']
df['c'] = groups['c'].ffill()
df['c'] = groups['c'].shift()
输出:
group a b c
0 0 'a' 3 NaN
1 0 'a' 56 NaN
2 0 'b' 7 56.0
3 0 'b' 80 56.0
4 0 'b' 55 56.0
5 0 'f' 601 55.0
6 0 'f' -4 55.0
7 0 'g' 33 -4.0
8 0 'g' 22 -4.0
9 1 'a' 3 NaN
10 1 'a' 56 NaN
11 1 'b' 7 56.0
12 1 'b' 80 56.0
13 1 'b' 55 56.0
14 1 'f' 601 55.0
15 1 'f' -4 55.0
16 1 'g' 33 -4.0
17 1 'g' 22 -4.0
如果您的数据确实如示例中所示具有重复的索引,则可以执行以下操作:
# save the index
idx = df.index
# remove the index
df = df.reset_index(drop=True)
groups = df.groupby('group')
df['c'] = df.loc[df['a']!=groups['a'].shift(-1),'b']
df['c'] = groups['c'].ffill()
df['c'] = groups['c'].shift()
# put the index back
df.index = idx