簡體   English   中英

如何計算Python DataFrame中非連續行之間的差異?

[英]How to calculate difference between non-consecutive rows in Python DataFrame?

我關注 pandas DataFrame 並嘗試創建一個新的“Value_Diff”列,在該列中計算當前“值”之間的差異,如果 lable=0 與之前的值(其中 label=1)。 如果 label=1 它設置“Value_Diff”等於 0。這個過程需要對每個組重復,如果組中的第一個 label 等於 0,它應該讓“Value_Diff”等於 0,直到它到達第一個 label= 1 然后遵循相同的邏輯(本例中為組 C)

我可以為每個單獨的組編寫一個 for 循環和 if 語句來執行此操作,但是想知道是否有更好的方法可以使用 groupby、lambda 或任何其他 function 來執行此操作。

這是輸入:

 group  Date         Value   label   
 A     2020-03-01   -117    1           
 A     2020-03-02   -121    0             
 A     2020-03-03   -122    0           
 A     2020-03-04   -122    1           
 B     2020-03-05   -118    1           
 B     2020-03-06   -122    0           
 B     2020-03-07   -124    0           
 B     2020-03-08   -126    0           
 B     2020-03-09   -126    1           
 C     2020-03-10   -130    0           
 C     2020-03-11   -140    0           
 C     2020-03-12   -150    1           
 C     2020-03-13   -160    0           

答案應如下所示:

 group  Date        Value  label   Value_Diff
 A     2020-03-01   -117    1         0
 A     2020-03-02   -121    0         4 (-117-(-121)=4)
 A     2020-03-03   -122    0         1
 A     2020-03-04   -122    1         0
 B     2020-03-05   -118    1         0
 B     2020-03-06   -122    0         4
 B     2020-03-07   -124    0         2
 B     2020-03-08   -126    0         2
 B     2020-03-09   -126    1         0
 C     2020-03-10   -130    0         0
 C     2020-03-11   -140    0         0  
 C     2020-03-12   -150    1         0  
 C     2020-03-13   -160    0         10

抱歉,我的第一個 output 並沒有真正反映我想要的,因為@BENY 為這個 output 提供了解決方案,我將把它留在這里以幫助其他有同樣問題的人。 下面是實際 output 的樣子。

 group  Date        Value  label   Value_Diff
 A     2020-03-01   -117    1         0
 A     2020-03-02   -121    0         4 (-117-(-121)=4)
 A     2020-03-03   -122    0         5 (-117-(-122)=5)
 A     2020-03-04   -122    1         0
 B     2020-03-05   -118    1         0
 B     2020-03-06   -122    0         4 (-122-(-118)=4)
 B     2020-03-07   -124    0         6 (-124-(-118)=6)
 B     2020-03-08   -126    0         8 (-126-(-118)=8)
 B     2020-03-09   -126    1         0
 C     2020-03-10   -130    0         0
 C     2020-03-11   -140    0         0  
 C     2020-03-12   -150    1         0  
 C     2020-03-13   -160    0         10 (-150-(-160)=10)

我們可以嘗試使用cummax創建第一個條件,然后使用groupbydiff

s = df.groupby('group').label.cummax()
df['new'] = -df.groupby('group').Value.diff().fillna(0).where(s==1 & df.label.ne(1),0)
df
Out[135]: 
   group        Date  Value  label   new
0      A  2020-03-01   -117      1  -0.0
1      A  2020-03-02   -121      0   4.0
2      A  2020-03-03   -122      0   1.0
3      A  2020-03-04   -122      1  -0.0
4      B  2020-03-05   -118      1  -0.0
5      B  2020-03-06   -122      0   4.0
6      B  2020-03-07   -124      0   2.0
7      B  2020-03-08   -126      0   2.0
8      B  2020-03-09   -126      1  -0.0
9      C  2020-03-10   -130      0  -0.0
10     C  2020-03-11   -140      0  -0.0
11     C  2020-03-12   -150      1  -0.0
12     C  2020-03-13   -160      0  10.0

我發現最好一步一步地做這些事情。 我認為這可以滿足您的需求(第二個版本):

df['Value_Last'] = np.nan
df.loc[df.label == 1, 'Value_Last'] = df.loc[df.label == 1, 'Value']
df_grouped = df.groupby('group')
df['Value_Last'] = df_grouped['Value_Last'].ffill()
df['Value_Diff'] = (df['Value_Last'] - df['Value']).fillna(0)


   group        Date  Value  label  Value_Last  Value_Diff
0      A  2020-03-01   -117      1      -117.0         0.0
1      A  2020-03-02   -121      0      -117.0         4.0
2      A  2020-03-03   -122      0      -117.0         5.0
3      A  2020-03-04   -122      1      -122.0         0.0
4      B  2020-03-05   -118      1      -118.0         0.0
5      B  2020-03-06   -122      0      -118.0         4.0
6      B  2020-03-07   -124      0      -118.0         6.0
7      B  2020-03-08   -126      0      -118.0         8.0
8      B  2020-03-09   -126      1      -126.0         0.0
9      C  2020-03-10   -130      0         NaN         0.0
10     C  2020-03-11   -140      0         NaN         0.0
11     C  2020-03-12   -150      1      -150.0         0.0
12     C  2020-03-13   -160      0      -150.0        10.0

PS:如果'Value'列僅包含整數,那么您可以在最后一行的末尾使用.astype(int)'Value_Diff'轉換回整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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