Python中合并DataFrame连续行的高效实现方法
解决方法
下面提供两种简洁高效的实现方式,适配你这种连续两行对应一组入场/出场记录的DataFrame结构:
方法一:拆分入场/出场子表后合并
逻辑直观易懂,适合明确两行一组的场景:
步骤代码
import pandas as pd # 构造示例数据(替换为你的实际DataFrame即可) data = { 'cross entry': [6.49223, None, 3.03064, None], 'cross exit': [None, 6.63997, None, 2.99758], 'Rate': [6.6130, 6.4920, 3.1830, 2.8000] } dates = pd.to_datetime(['2000-04-27', '2000-06-06', '2001-11-26', '2001-12-04']) df = pd.DataFrame(data, index=dates) # 1. 提取入场记录行(cross entry不为空),重置索引并重命名字段 entry_df = df[df['cross entry'].notna()].reset_index().rename( columns={'Dates': 'Entry Dates', 'Rate': 'Entry Rate'} ) # 2. 提取出场记录行(cross exit不为空),重置索引并重命名字段 exit_df = df[df['cross exit'].notna()].reset_index().rename( columns={'Dates': 'Exit Date', 'Rate': 'Exit Rate'} ) # 3. 按行索引合并子表,调整列顺序并设置最终索引 merged_df = pd.concat([entry_df, exit_df[['Exit Date', 'cross exit', 'Exit Rate']]], axis=1) merged_df = merged_df.set_index('Entry Dates')[['Exit Date', 'cross entry', 'cross exit', 'Entry Rate', 'Exit Rate']]
结果示例
执行后merged_df将输出你需要的格式:
Exit Date cross entry cross exit Entry Rate Exit Rate Entry Dates 2000-04-27 2000-06-06 6.49223 6.63997 6.613 6.492 2001-11-26 2001-12-04 3.03064 2.99758 3.183 2.800
方法二:分组聚合实现
数据量较大时,分组聚合的方式执行效率更高:
步骤代码
import pandas as pd import numpy as np # 构造示例数据(替换为你的实际DataFrame即可) data = { 'cross entry': [6.49223, None, 3.03064, None], 'cross exit': [None, 6.63997, None, 2.99758], 'Rate': [6.6130, 6.4920, 3.1830, 2.8000] } dates = pd.to_datetime(['2000-04-27', '2000-06-06', '2001-11-26', '2001-12-04']) df = pd.DataFrame(data, index=dates) # 1. 生成分组标签:每两行归为一组 groups = df.groupby(np.arange(len(df)) // 2) # 2. 聚合每组数据:cross entry取第一行,cross exit取最后一行,Rate分取入场/出场值 agg_result = groups.agg({ 'cross entry': 'first', 'cross exit': 'last', 'Rate': ['first', 'last'] }) # 3. 整理列名、添加日期字段、设置最终索引 agg_result.columns = ['cross entry', 'cross exit', 'Entry Rate', 'Exit Rate'] agg_result.insert(0, 'Exit Date', df[df['cross exit'].notna()].index) agg_result = agg_result.set_index(df[df['cross entry'].notna()].index).rename_axis('Entry Dates')
核心逻辑
用np.arange(len(df)) // 2生成连续分组ID(如0,0,1,1...),将每两行划为一组,再通过聚合函数精准提取每组内的入场、出场数据,最后调整格式得到目标结果。
内容的提问来源于stack exchange,提问作者GDPKeynes
相关产品推荐
相关产品推荐

