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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:15:30