簡體   English   中英

熊貓在組內的變量轉移

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM