我有一个数据框:
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))
无济于事,并得到“系列的真实值(value)不明确”。错误。感谢任何帮助。谢谢!
最佳答案
您可以通过 self 合并
和对索引的一些操作来完成此操作:
# 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/