我有一個資料框,其中包含幾年來從 44 個獨特的個人收集的生活記錄資料。
Int64Index: 77171 entries, 0 to 4279
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 start 77171 non-null datetime64[ns]
1 end 77171 non-null datetime64[ns]
2 labelName 77171 non-null category
3 id 77171 non-null int64
該start列包含格式為 的粒度日期2020-11-01 11:00:00時間,間隔為 30 分鐘。該labelName列有 14 個不同的類別。
Categories (14, object): ['COOK', 'EAT', 'GO WALK', 'GO TO BATHROOM', ..., 'DRINK', 'WAKE UP', 'SLEEP', 'WATCH TV']
這是一個示例用戶的頭部,時間[2588 rows x 4 columns]跨度從 2020 年到 2021 年。資料中偶爾也會出現空白。
start end labelName id
0 2020-08-05 00:00:00 2020-08-05 00:30:00 GO TO BATHROOM 486
1 2020-08-05 06:00:00 2020-08-05 06:30:00 WAKE UP 486
2 2020-08-05 09:00:00 2020-08-05 09:30:00 COOK 486
3 2020-08-05 11:00:00 2020-08-05 11:30:00 EAT 486
4 2020-08-05 12:00:00 2020-08-05 12:30:00 EAT 486
.. ... ... ... ...
859 2021-03-10 12:30:00 2021-03-10 13:00:00 GO TO BATHROOM 486
861 2021-03-10 13:30:00 2021-03-10 14:00:00 GO TO BATHROOM 486
862 2021-03-10 18:30:00 2021-03-10 19:00:00 COOK 486
864 2021-03-11 08:00:00 2021-03-11 08:30:00 EAT 486
865 2021-03-11 12:30:00 2021-03-11 13:00:00 COOK 486
我想要labelNames每個用戶每月每個唯一用戶的總和,但我不知道該怎么做。
我會首先將資料框拆分為id,這很容易。start但是,當它每 30 分鐘記錄幾年的資料時,如何拆分這些日期時間——然后創建 14 個新列來記錄總和?
最終的資料框可能看起來像這樣(帶有假值):
| 用戶 | 月 | 睡覺 | ... | 看電視 |
|---|---|---|---|---|
| 486 | 6月20日 | 324 | ... | 23 |
| 486 | 7月20日 | 234 | ... | 12 |
該資料框的用例是訓練一些統計和機器學習模型。
我如何實作這樣的目標?
uj5u.com熱心網友回復:
因為有 30 分鐘的資料,您可以按月按月計算它們
示范:
#Preparing Data
string = """start end labelName id
2020-09-21 14:30:00 2020-09-21 15:00:00 WAKE UP 650
2020-09-21 15:00:00 2020-09-21 15:30:00 GO TO BATHROOM 650
2020-09-21 15:30:00 2020-09-21 16:00:00 SLEEP 650
2020-09-29 17:00:00 2020-09-29 17:30:00 WAKE UP 650
2020-09-29 17:30:00 2020-09-29 18:00:00 GO TO BATHROOM 650
2021-03-11 13:00:00 2021-03-11 13:30:00 EAT 650
2021-03-11 14:30:00 2021-03-11 15:00:00 GO TO BATHROOM 650
2021-03-11 15:00:00 2021-03-11 15:30:00 COOK 650
2021-03-11 15:30:00 2021-03-11 16:00:00 EAT 650
2021-03-11 16:00:00 2021-03-11 16:30:00 SLEEP 650"""
data = [x.split(' ') for x in string.split('\n')]
df = pd.DataFrame(data[1:], columns = data[0])
df['start'] = pd.to_datetime(df['start'])
#Solution
from collections import Counter
df.groupby([df['start'].dt.to_period('M'), 'id'])['labelName'].apply(lambda x: Counter(x)).reset_index().pivot_table('labelName', ['id', 'start'], 'level_2', fill_value=0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484961.html
