![](/img/trans.png)
[英]Python Pandas: How to subtract values in two non-consecutive rows in a specific column of a dataframe from one another
[英]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
創建第一個條件,然后使用groupby
和diff
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.