如何在Python Pandas中合并datetime列生成时间戳与标记列?
解决方案
这问题用pandas的内置工具就能轻松搞定,给你两种适配需求的方案,都能得到你想要的结果:
方案一:利用combine_first和行判断(完美保留原始行顺序)
这种方法最贴合你的示例输出,严格按照原始DataFrame的行顺序生成结果,代码简洁直观:
import pandas as pd # 假设你的原始数据存储在DataFrame df中 # 生成目标DataFrame result = pd.DataFrame({ 'Timestamp': df['begin'].combine_first(df['end']), 'Flag': df.apply(lambda row: 'begin' if pd.notna(row['begin']) else 'end', axis=1) }).reset_index(drop=True)
原理说明:
df['begin'].combine_first(df['end']):对每一行优先取begin列的非空值,若begin为空则取end列的值,正好匹配你数据每行仅一个非空时间的特点。apply函数:逐行判断,只要begin列非空就标记为begin,否则标记为end。- 最后
reset_index(drop=True)重置索引,让结果和你的示例索引完全一致。
方案二:用melt函数(宽表转长表通用方法)
如果以后你的数据结构有变化(比如某行可能同时存在begin和end值),这种通用的宽转长方法会更灵活:
import pandas as pd # 宽表转长表 melted = df.melt(var_name='Flag', value_name='Timestamp') # 过滤空值并保持原始顺序 result = melted.dropna(subset=['Timestamp']).sort_index().reset_index(drop=True)
原理说明:
melt函数会把begin和end的列名转为Flag列的值,对应列的内容转为Timestamp列的值。dropna去掉时间为空的行,sort_index保证结果顺序和原始数据一致,最后重置索引。
运行任意一种方案后,你都会得到和示例完全一致的DataFrame,包含Timestamp和Flag两列。
内容的提问来源于stack exchange,提问作者Zebra125
相关产品推荐
相关产品推荐

