我有一个数据框:
c1 Lag Val1
A 3 10
A 1 5
A 2 20
A 2 15
A 1 10
B 1 25
B 2 10
我想创建一个新的字段val2,使val2中的每个值都是val2中的值,并按行的延迟数移动。这里棘手的部分是,移位应该发生在字段c1中定义的组中,这样输出看起来像
c1 Lag Val1 Val2
A 3 10 15
A 1 5 20
A 2 20 10
A 2 15 NaN
A 1 10 NaN
B 1 25 10
B 2 10 NaN
我一直在努力
df['Val2'] = df.groupby(['c1'])['Val1'].apply(lambda x:x.shift(df.Lag))
没有用,得到一个“序列的真值是模棱两可的。”错误。谢谢你的帮助。谢谢!
最佳答案
您可以通过self-merge
和对索引的一点操作来实现这一点:
# Copy and keep only the columns that are relevant
df2 = df.rename(columns={'Val1': 'Val2'}).drop(columns='Lag').copy()
# Shift the index
df.index = df.index+df.Lag
# Merge, requiring match on shifted index and within group.
df.reset_index().merge(df2.reset_index(), on=['index', 'c1'], how='left').drop(columns='index')
输出:
c1 Lag Val1 Val2
0 A 3 10 15.0
1 A 1 5 20.0
2 A 2 20 10.0
3 A 2 15 NaN
4 A 1 10 NaN
5 B 1 25 10.0
6 B 2 10 NaN
关于python - Pandas 在组内的变量转移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52940317/