我的 DataFrame 看起來像這樣:
| ID | 日期 | 價值 |
|---|---|---|
| 1 | 2021-07-16 | 100 |
| 2 | 2021-09-15 | 20 |
| 1 | 2021-04-10 | 50 |
| 1 | 2021-08-27 | 30 |
| 2 | 2021-07-22 | 15 |
| 2 | 2021-07-22 | 25 |
| 1 | 2021-06-30 | 40 |
| 3 | 2021-10-11 | 150 |
| 2 | 2021-08-03 | 15 |
| 1 | 2021-07-02 | 90 |
我想按id分組,并回傳90天期間總值的差異。具體來說,我想要基于今天和基于 30 天前的過去 90 天的值。
例如,考慮到今天是 2021-10-13,我想得到:
- 2021-10-13 和 2021-07-15 之間每個 id 的所有值的總和
- 2021-09-13 和 2021-06-15 之間每個 ID 的所有值的總和
最后,減去它們以獲得變化。
我已經設法通過創建單獨的臨時資料幀來計算它,其中僅包含 90 天期間的日期,按 id 分組,然后將這些臨時資料幀合并到最后一個。但我想這應該是一種更簡單或更簡單的方法。感謝任何幫助!
順便說一句,對不起,如果解釋有點混亂。
uj5u.com熱心網友回復:
如果我理解正確,你需要這樣的東西:
import pandas as pd
import datetime
## Calculation of the dates that we are gonna need.
today = datetime.datetime.now()
delta = datetime.timedelta(days = 120)
# Date of the 120 days ago
hundredTwentyDaysAgo = today - delta
delta = datetime.timedelta(days = 90)
# Date of the 90 days ago
ninetyDaysAgo = today - delta
delta = datetime.timedelta(days = 30)
# Date of the 30 days ago
thirtyDaysAgo = today - delta
## Initializing an example df.
df = pd.DataFrame({"id":[1,2,1,1,2,2,1,3,2,1],
"date": ["2021-07-16", "2021-09-15", "2021-04-10", "2021-08-27", "2021-07-22", "2021-07-22", "2021-06-30", "2021-10-11", "2021-08-03", "2021-07-02"],
"value": [100,20,50,30,15,25,40,150,15,90]})
## Casting date column
df['date'] = pd.to_datetime(df['date']).dt.date
grouped = df.groupby('id')
# Sum of last 90 days per id
ninetySum = grouped.apply(lambda x: x[x['date'] >= ninetyDaysAgo.date()]['value'].sum())
# Sum of last 90 days, starting from 30 days ago per id
hundredTwentySum = grouped.apply(lambda x: x[(x['date'] >= hundredTwentyDaysAgo.date()) & (x['date'] <= thirtyDaysAgo.date())]['value'].sum())
輸出是
ninetySum - hundredTwentySum
id
1 -130
2 20
3 150
dtype: int64
您可以通過列印ninetySum和hundredTwentySum變數仔細檢查以確保這些是您想要的數字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315294.html
標籤:Python 熊猫 数据框 筛选 pandas-groupby
