Python中处理含重复时间列的数据集并转换为宽表的实现方法
解决Pandas长格式转宽格式的问题
嘿,作为Python新手遇到这种长转宽的需求很正常,我来帮你一步步解决,顺便优化你创建DataFrame的代码~
第一步:优化DataFrame的创建方式
你原来的创建方式确实有点绕,我们可以直接用字典传入pd.DataFrame,代码更简洁直观,也不容易出错:
import pandas as pd import numpy as np # 修正了原列表中的笔误(第二个Noise的时间应为12:20,和示例数据匹配) time_col = [ np.datetime64('2021-04-28T12:10:00'), np.datetime64('2021-04-28T12:20:00'), np.datetime64('2021-04-28T12:30:00'), np.datetime64('2021-04-28T12:40:00'), np.datetime64('2021-04-28T12:50:00'), np.datetime64('2021-04-28T12:10:00'), np.datetime64('2021-04-28T12:20:00'), np.datetime64('2021-04-28T12:30:00'), np.datetime64('2021-04-28T12:40:00'), np.datetime64('2021-04-28T12:50:00') ] val_col = [10,20,20,35,35, 100,130,155,160,175] value = ["Students", "Students", "Students", "Students", "Students", "Noise", "Noise", "Noise", "Noise", "Noise"] # 直接用字典构造DataFrame,清晰高效 df = pd.DataFrame({ "time_col": time_col, "val_col": val_col, "value": value })
第二步:将长格式转成宽格式
我们可以用Pandas的pivot()方法来实现这个转换,它专门用来处理这种“长表转宽表”的场景:
# 执行长转宽操作 wide_df = df.pivot( index='time_col', # 作为行标识的列(不重复的时间) columns='value', # 要转成新列的类别(Students/Noise) values='val_col' # 填充新列的数值 ).reset_index() # 把time_col从索引变回普通列 # 去掉列名的层级标签,让输出格式和你想要的完全一致 wide_df.columns.name = None
运行这段代码后,wide_df就是你想要的宽格式数据啦!
补充说明:如果存在重复的(time_col, value)组合
如果你的数据中同一个时间和类别对应多个数值,可以用pivot_table()替代,并指定聚合函数(比如取平均值、第一个值等):
# 例如取重复值的第一个 wide_df = df.pivot_table( index='time_col', columns='value', values='val_col', aggfunc='first' ).reset_index() wide_df.columns.name = None
内容的提问来源于stack exchange,提问作者user13421
相关产品推荐
相关产品推荐

