如何将含二维列表列的Pandas DataFrame转换为新DataFrame
解决方法
步骤1:展开values列并拆分时间戳与数值
先把每行的二维列表拆成独立行,再将每个列表元素拆分为timestamp和对应指标值两列:
import pandas as pd # 假设原DataFrame名为df # 把values里的每个子列表拆成单独行 df_exploded = df.explode('values', ignore_index=True) # 拆分values中的时间戳和数值 df_exploded[['timestamp', 'value']] = pd.DataFrame(df_exploded['values'].tolist(), index=df_exploded.index) # 删除原values列 df_exploded = df_exploded.drop('values', axis=1)
步骤2:将指标名称转为列名(透视表)
用pivot把name列内容转为列,再让timestamp成为普通列:
# 透视转换 result_df = df_exploded.pivot(index='timestamp', columns='name', values='value').reset_index() # 清除列名的层级标签 result_df.columns.name = None
完整测试代码
用模拟数据验证效果:
import pandas as pd # 模拟原DataFrame结构 data = { 'values': [ [[1717813770, 1044], [1717813800, 1045]], [[1717813770, 8648172], [1717813800, 8648178]], [[1717813770, 2705571], [1717813800, 2725355]], [[1717813770, 4173437], [1717813800, 4523487]] ], 'name': ['rx_busy', 'rx_reuse', 'rx_bytes', 'tx_bytes'] } df = pd.DataFrame(data) # 执行转换流程 df_exploded = df.explode('values', ignore_index=True) df_exploded[['timestamp', 'value']] = pd.DataFrame(df_exploded['values'].tolist(), index=df_exploded.index) df_exploded = df_exploded.drop('values', axis=1) result_df = df_exploded.pivot(index='timestamp', columns='name', values='value').reset_index() result_df.columns.name = None print(result_df)
运行后输出结果:
timestamp rx_busy rx_reuse rx_bytes tx_bytes 0 1717813770 1044 8648172 2705571 4173437 1 1717813800 1045 8648178 2725355 4523487
补充提示
如果原数据存在同一时间戳对应多个相同指标的重复值,可改用pivot_table并指定聚合函数(比如aggfunc='mean')处理。
内容的提问来源于stack exchange,提问作者liw
相关产品推荐
相关产品推荐

