[英]Pandas variable shifting within groups
我有一個數據框:
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))
無濟於事,並得到“系列的真相值不明確”。 錯誤。 感謝任何幫助。 謝謝!
您可以通過自我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
您很可能必須為應用編寫自己的函數。 這樣的事情會起作用,但是可能有比迭代行並重復計算行移位更有效的方法...
def shift_rows(g):
g['Val2'] = np.nan
for i,r in g.iterrows():
g.at[i, 'Val2'] = g['Val1'].shift(-r['Lag'])[i]
return g
output = df.groupby('c1').apply(shift_rows)
print(output)
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
想法是遍歷groupby對象的每一行,以使用Lag
的值計算行移位,然后拉出所需的新值。 這將存儲到該行的Val2
中,並返回整個組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.