我有一个数据框架,其中包含了从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,这很容易.但是,当它在几年内每隔30分钟记录一次数据时,如何拆分这start个日期时间,然后创建14个新列来记录总和?

最终数据帧可能如下所示(带有假值):

user month SLEEP ... WATCH TV
486 jun20 324 ... 23
486 jul20 234 ... 12

这个数据框架的用例是训练一些统计和机器学习模型.

我如何实现这样的目标?

推荐答案

因为有30分钟的数据,所以您可以按每月crosstab个月、按月份、按Series.dt.to_period个周期、再乘以0.5以小时为单位计算输出:

If start is 100 and end is 101 then if need count this record for October use 102 in 103, if for September use 104 .

df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

df1 = (pd.crosstab([df['id'], df['end'].dt.to_period('m')], df['labelName']).mul(0.5)
        .rename_axis(columns=None, index=['id','month'])
        .rename(columns=str)
        .reset_index()
        .assign(month=lambda x:x['month'].dt.strftime('%b%Y')))
print (df1)
    id    month  COOK  EAT  GO TO BATHROOM  SLEEP  WAKE UP
0  650  Sep2020   0.0  0.0             1.0    0.5      1.0
1  650  Mar2021   0.5  1.0             0.5    0.5      0.0

对于30分钟内的输出:

df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

df = (pd.crosstab([df['id'], df['end'].dt.to_period('m')], df['labelName'])
        .rename_axis(columns=None, index=['id','month'])
        .reset_index()
        .assign(month=lambda x:x['month'].dt.strftime('%b%Y')))
print (df)

    id    month  COOK  EAT  GO TO BATHROOM  SLEEP  WAKE UP
0  650  Sep2020     0    0               2      1        2
1  650  Mar2021     1    2               1      1        0

Python相关问答推荐

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

仿制药的类型铸造

'discord.ext. commanders.cog没有属性监听器'

如何让剧作家等待Python中出现特定cookie(然后返回它)?

抓取rotowire MLB球员新闻并使用Python形成表格

如何在Python中并行化以下搜索?

如何在python polars中停止otherate(),当使用when()表达式时?

Python中绕y轴曲线的旋转

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

运输问题分支定界法&

提取相关行的最快方法—pandas

当我try 在django中更新模型时,模型表单数据不可见

如何更改groupby作用域以找到满足掩码条件的第一个值?

如何使用两个关键函数来排序一个多索引框架?

如何杀死一个进程,我的Python可执行文件以sudo启动?

numpy.unique如何消除重复列?

交替字符串位置的正则表达式

从源代码显示不同的输出(机器学习)(Python)

Matplotlib中的曲线箭头样式

大Pandas 中的群体交叉融合