You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Pandas DataFrame从宽格式转换为长格式

宽格式转长格式的实现方案

方法一:拆分后拼接(直观匹配目标顺序)

这种方法直接提取两组动作-时间列,重命名后拼接,完全匹配你想要的输出顺序:

import pandas as pd

# 初始化原始数据
data = [['Tom', 'run', '2022-01-26', 'run', '2027-01-26'], 
        ['Max', 'stop', '2020-11-16', 'run', '2022-04-26'], 
        ['Bob', 'run', '2021-10-03', 'stop', '2022-01-26'], 
        ['Ben', 'run', '2020-03-11', 'stop', '2013-01-26'], 
        ['Eva', 'stop', '2017-11-16', 'run', '2015-01-26']]
df = pd.DataFrame(data, columns=['person', 'action_1', 'time_1', 'action_2', 'time_2'])

# 提取第一组动作-时间并改名
df_part1 = df[['person', 'action_1', 'time_1']].rename(columns={'action_1': 'action', 'time_1': 'time'})
# 提取第二组动作-时间并改名
df_part2 = df[['person', 'action_2', 'time_2']].rename(columns={'action_2': 'action', 'time_2': 'time'})

# 拼接两组数据并重置索引
df_long = pd.concat([df_part1, df_part2], ignore_index=True)

print(df_long)

方法二:使用wide_to_long(适合批量处理多组列)

如果后续有更多类似action_n/time_n的列,用wide_to_long更高效,只需调整参数即可:

import pandas as pd

# 初始化原始数据(同上)
data = [['Tom', 'run', '2022-01-26', 'run', '2027-01-26'], 
        ['Max', 'stop', '2020-11-16', 'run', '2022-04-26'], 
        ['Bob', 'run', '2021-10-03', 'stop', '2022-01-26'], 
        ['Ben', 'run', '2020-03-11', 'stop', '2013-01-26'], 
        ['Eva', 'stop', '2017-11-16', 'run', '2015-01-26']]
df = pd.DataFrame(data, columns=['person', 'action_1', 'time_1', 'action_2', 'time_2'])

# 宽转长,指定前缀和标识符列
df_long = pd.wide_to_long(df, stubnames=['action', 'time'], i='person', j='event').reset_index()
# 移除临时的event列,并排序保持原始顺序
df_long = df_long.sort_values('event', kind='mergesort').drop('event', axis=1).reset_index(drop=True)

print(df_long)

两种方法都会输出你期望的长格式DataFrame。

内容的提问来源于stack exchange,提问作者juststarted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:35:19