看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
有这样的一个数据,一列为年份,一列为时间,最后一列 content 前两列的具体时间的标识,需求是需要将时间(由前两列组成)按每两分钟进行聚合,然后在每个两分钟内有 content 列值的个数标记下由 content 值为列的单元格中,最终形成一个稀疏矩阵。这种数据处理一般是为机器学习做准备的,是一个特征构建的过程。
数据如下:
# 数据,复制
'''
date time content
2021/8/12 22:22:34.722+8:00 A
2021/8/12 22:23:34.222+8:00 B
2021/8/12 22:34:45.213+8:00 A
2021/8/12 22:35:34.722+8:00 D
2021/8/12 22:36:34.722+8:00 C
2021/8/12 22:37:34.722+8:00 E
2021/8/12 22:38:34.722+8:00 E
2021/8/12 22:39:34.722+8:00 F
2021/8/12 22:40:34.423+8:00 E
2021/8/12 22:41:34.722+8:00 C
2021/8/12 22:42:34.422+8:00 B
2021/8/12 22:43:34.722+8:00 B
2021/8/12 22:44:34.722+8:00 A
'''
# 执行,从剪贴板读取数据
df = pd.read_clipboard()
先将前两列转为时间(两个单列不是时间,都是字符串),然后按两分钟进行分组重采样,聚合计算时计算 content 标识的数量,最终形成了一个两层索引的数据,最后进行解堆操作以及一些数据格式的处理就完成了需求。代码如下:
(
df.loc[:, ['content']] # 选取标识列,与下行时间转换后形成新的 df
.assign(time=pd.to_datetime(df['date'] + ' ' +df['time']))
# 时间分组,每两分钟分组到一起
.groupby(pd.Grouper(freq='2Min', key='time'))
# 聚合方法为计算标识的数量
.apply(lambda x: x.content.value_counts())
.unstack() # 解除堆叠
.fillna(0)
.astype(int)
)
'''
A B C D E F
time
2021-08-12 22:22:00+08:00 1 1 0 0 0 0
2021-08-12 22:34:00+08:00 1 0 0 1 0 0
2021-08-12 22:36:00+08:00 0 0 1 0 1 0
2021-08-12 22:38:00+08:00 0 0 0 0 1 1
2021-08-12 22:40:00+08:00 0 0 1 0 1 0
2021-08-12 22:42:00+08:00 0 2 0 0 0 0
2021-08-12 22:44:00+08:00 1 0 0 0 0 0
'''
以上代码的每一步结果,可以注释掉当前代码以后的代码行执行查看。
(完)
更新时间:Aug. 18, 2024, 3:38 p.m. 标签:pandas python 稀疏矩阵 时序数据