從下面的資料集開始:
| 用戶身份 | temp_Id | 日期 |
|---|---|---|
| 一個 | A1 | 2020 年 1 月 2 日 |
| 一個 | A1 | 2020 年 1 月 2 日 |
| 一個 | A2 | 2020 年 5 月 2 日 |
| 一個 | A3 | 2020 年 7 月 2 日 |
| 乙 | B1 | 2020 年 1 月 1 日 |
| C | C1 | 2020 年 5 月 1 日 |
| C | C2 | 2020 年 6 月 2 日 |
| D | D1 | 2020 年 7 月 1 日 |
| D | D2 | 2020 年 8 月 2 日 |
| D | D3 | 2020 年 9 月 2 日 |
我將如何獲得一個包含兩列的新資料框,以便對于每一user_id列(第一列),第二列將提供最后一個和上一個連接日期之間的差異?PS:對于 B,結果將為零
它在所有 user_id 上使用嵌套回圈,但我正在尋找最 Pythonic 的方式來做到這一點。我想 pandas.groupby 將是最好的選擇。
謝謝
編輯:日期時間格式為日/月/年
所需的輸出將是這樣的
| 用戶身份 | 三角洲 |
|---|---|
| 一個 | 2 |
| 乙 | 0 |
| C | 31 |
| D | 1 |
uj5u.com熱心網友回復:
假設年份是 2020,如果您的日期有一年作為其中的一部分,那么計算 date2 中的第一行將被修改
在 df 的新列中計算日期為 yyyy-mm-dd
使用 groupby 和 transform 計算當前和前一個天數之間的差異
更新了第一行,現在日期有一年作為它的一部分
###df['date2'] = df['Date'].str.split('/').apply(lambda x: '2020-' x[1] '-' x[0] ).astype('datetime64')
# date is in dd/mm/yyyy format
df['date2'] = df['Date'].str.split('/').apply(lambda x: x[2] '-' x[1] '-' x[0] ).astype('datetime64')
df['diff']=df.groupby('User_id')['date2'].transform(lambda y: y-y.shift(1))
User_id temp_Id Date date2 diff
0 A A1 01/02 2020-02-01 NaT
1 A A1 01/02 2020-02-01 0 days
2 A A2 05/02 2020-02-05 4 days
3 A A3 07/02 2020-02-07 2 days
4 B B1 01/01 2020-01-01 NaT
5 C C1 05/01 2020-01-05 NaT
6 C C2 06/02 2020-02-06 32 days
7 D D1 07/01 2020-01-07 NaT
8 D D2 08/02 2020-02-08 32 days
9 D D3 09/02 2020-02-09 1 days
獲取最后一個值,在問題更新為更多詳細資訊后
df.groupby(['User_id'])['diff'].last().to_frame()
User_id diff
A 2 days
B NaT
C 32 days
D 1 days
uj5u.com熱心網友回復:
第二列將提供上次和上次連接日期之間的差異。
你能給我樣品所需的輸出嗎?
我添加了答案
def get_result(list_day):
list_day = sorted(list_day)
if list_day == 1:
return 0
return (list_day[-1] - list_day[-2]).days
group_df = df.groupby("User_id")["Date"].apply(lambda x: get_result(list(x)))
group_df
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/487169.html
