按ID重塑Dataframe并统计各活动强度预测值的求和结果
解决方案:用Pandas统计活动强度出现次数并重塑数据
嘿,我来帮你搞定这个数据处理需求!针对你描述的按ID统计各预测列活动强度次数的问题,用Pandas可以轻松实现,下面是具体步骤和代码:
步骤说明
你的原始数据是按ID和时间戳组织的宽表,我们需要先把数据“拉长”(转成窄表),再分组统计次数,最后重新“拉宽”成你想要的格式。
1. 导入库并读取数据
首先导入Pandas,然后读取你的数据集(这里假设是CSV格式,根据你的实际存储格式调整即可):
import pandas as pd # 读取数据,替换成你的文件路径 df = pd.read_csv('your_activity_data.csv')
2. 将宽表转换为窄表(Melt操作)
我们需要把x1到x8这8列转换成“特征名-强度值”的形式,这样方便后续分组统计:
# 保留id列作为分组依据,将x1-x8列转成变量名和对应强度值 melted_df = df.melt( id_vars='id', value_vars=[f'x{i}' for i in range(1, 9)], # 覆盖x1到x8 var_name='feature', value_name='Intensity' )
执行后的数据会变成三列:id、feature(比如x1、x2)、Intensity(比如Light、Moderate),每一行对应某个ID下某一列的强度值。
3. 分组统计次数并重塑回宽表
接下来按id、Intensity、feature分组统计出现次数,然后把feature列转成列名,同时填充缺失的强度值为0:
# 分组统计每个ID-强度-特征的出现次数 count_df = melted_df.groupby(['id', 'Intensity', 'feature']).size().unstack(fill_value=0) # 重置索引,让id和Intensity成为普通列 result = count_df.reset_index()
4. 调整列顺序(可选)
如果需要保证x1到x8的列顺序严格对应,可以手动调整列的顺序:
# 重新排列列,确保id、Intensity在前,x1-x8按顺序排列 result = result[['id', 'Intensity'] + [f'x{i}' for i in range(1, 9)]]
示例验证
用你给出的样例数据测试:
原始数据:
id time x1 x2 x3 1 10:30 Moderate Light Light 1 10:31 Moderate Light Moderate 2 12:24 Light Light Light 2 12:25 Light Light Light
执行代码后得到的结果如下(会自动包含所有出现过的强度类型,未出现的强度次数为0):
id Intensity x1 x2 x3 x4 x5 x6 x7 x8 0 1 Light 0 2 1 0 0 0 0 0 1 1 Moderate 2 0 1 0 0 0 0 0 2 2 Light 2 2 2 0 0 0 0 0 3 2 Moderate 0 0 0 0 0 0 0 0 # 若原始数据有Sedentary或Vigorous,也会生成对应的行
这个方法针对80个ID和8列的规模完全没问题,效率很高,能快速得到你想要的结果。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

