成為以下 python pandas DataFrame:
| num_ID | start_date | end_date | other_column |
| ------ | ----------- | ---------- | ----------------- |
| 1 | 2022-02-14 | 2022-02-15 | 09:23:00 |
| 1 | 2022-02-20 | 2022-02-25 | 12:10:01 |
| 2 | 2022-03-11 | 2022-03-21 | 08:21:00 |
| 2 | 2022-03-22 | 2022-03-27 | 02:36:00 |
| 2 | 2022-04-10 | 2022-04-15 | 11:43:03 |
| 3 | 2022-02-04 | 2022-02-06 | 16:51:00 |
| 3 | 2022-02-14 | 2022-02-23 | 19:35:10 |
| 3 | 2022-03-05 | 2022-03-06 | 21:05:13 |
| 4 | 2022-02-28 | 2022-10-12 | 00:01:00 |
對于每個值,如果前一行的值與實際值相隔至少 7 天num_ID,我想添加一個diff_weeks具有累積值的新列。end_datestart_date
首先為每個值的第一行添加該列的值 0 num_ID,因為它們沒有前一行。
| num_ID | start_date | end_date | other_column | diff_weeks |
| ------ | ----------- | ---------- | ----------------- | ----------- |
| 1 | 2022-02-14 | 2022-02-15 | 09:23:00 | 0 |
| 1 | 2022-02-20 | 2022-02-25 | 12:10:01 | |
| 2 | 2022-03-11 | 2022-03-21 | 08:21:00 | 0 |
| 2 | 2022-03-22 | 2022-03-27 | 02:36:00 | |
| 2 | 2022-04-10 | 2022-04-15 | 11:43:03 | |
| 3 | 2022-02-04 | 2022-02-06 | 16:51:00 | 0 |
| 3 | 2022-02-14 | 2022-02-23 | 19:35:10 | |
| 3 | 2022-03-05 | 2022-03-06 | 21:05:13 | |
| 4 | 2022-02-28 | 2022-10-12 | 00:01:00 | 0 |
最后,我們用條件填充剩余的行,如果end_date前一行的值(具有相同的num_ID)與當前的 相距至少 7 天start_date。新值是前一行的值加 1。
| num_ID | start_date | end_date | other_column | diff_weeks |
| ------ | ----------- | ---------- | ----------------- | ----------- |
| 1 | 2022-02-14 | 2022-02-15 | 09:23:00 | 0 |
| 1 | 2022-02-20 | 2022-02-25 | 12:10:01 | 0 |
| 2 | 2022-03-11 | 2022-03-21 | 08:21:00 | 0 |
| 2 | 2022-03-22 | 2022-03-27 | 02:36:00 | 0 |
| 2 | 2022-04-10 | 2022-04-15 | 11:43:03 | 1 |
| 3 | 2022-02-04 | 2022-02-06 | 16:51:00 | 0 |
| 3 | 2022-02-14 | 2022-02-23 | 19:35:10 | 1 |
| 3 | 2022-03-05 | 2022-03-06 | 21:05:13 | 2 |
| 4 | 2022-02-28 | 2022-10-12 | 00:01:00 | 0 |
@mozway 提出了這段代碼,但它不做累積和并給我以下錯誤:TypeError: unsupported operand type(s) for -: 'datetime.date' and 'float'
df['diff_weeks'] = (df['start_date'].sub(df.groupby('num_ID')['end_date'].shift())
.ge('7d').astype(int)
)
uj5u.com熱心網友回復:
這個問題有兩個問題:
- 型別錯誤
TypeError: 不支持的運算元型別 -: 'datetime.date' 和 'float'
- 累計總和缺失。
問題 1
start_date這些列似乎end_date不是熊貓日期時間物件。為了進行轉換,使用pandas.to_datetime如下
df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])
有了它,就可以運行 mozway 的解決方案
df['diff_weeks'] = (df['start_date'].sub(df.groupby('num_ID')['end_date'].shift())
.ge('7d').astype(int)
)
[Out]:
num_ID start_date end_date other_column diff_weeks
0 1 2022-02-14 2022-02-15 09:23:00 0
1 1 2022-02-20 2022-02-25 12:10:01 0
2 2 2022-03-11 2022-03-21 08:21:00 0
3 2 2022-03-22 2022-03-27 02:36:00 0
4 2 2022-04-10 2022-04-15 11:43:03 1
5 3 2022-02-04 2022-02-06 16:51:00 0
6 3 2022-02-14 2022-02-23 19:35:10 1
7 3 2022-03-05 2022-03-06 21:05:13 1
8 4 2022-02-28 2022-10-12 00:01:00 0
剛剛在這里嘗試過,它奏效了。
問題 2
可以分組,num_id并使用之前創建的列diff_weeks,使用.cumsum()如下
df['diff_weeks'] = df.groupby('num_ID')['diff_weeks'].cumsum()
[Out]:
num_ID start_date end_date other_column diff_weeks
0 1 2022-02-14 2022-02-15 09:23:00 0
1 1 2022-02-20 2022-02-25 12:10:01 0
2 2 2022-03-11 2022-03-21 08:21:00 0
3 2 2022-03-22 2022-03-27 02:36:00 0
4 2 2022-04-10 2022-04-15 11:43:03 1
5 3 2022-02-04 2022-02-06 16:51:00 0
6 3 2022-02-14 2022-02-23 19:35:10 1
7 3 2022-03-05 2022-03-06 21:05:13 2
8 4 2022-02-28 2022-10-12 00:01:00 0
筆記:
- 對于未來,建議閱讀以下內容:一篇有多個問題的帖子還是多個帖子?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512539.html
上一篇:如何在沒有時刻的時間段中找到沖突
下一篇:追加查詢字串的重寫沒有觸發?
