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

如何基于指定列合并DataFrame并交错排列其行(支持多DataFrame)

基于指定列合并并交错排列多个DataFrame的行

给定以下DataFrame:

>>> df1
   A  B
0  1  a
1  2  a
2  3  a
3  4  a

>>> df2
   A  B
0  1  b
1  2  b
2  3  b
3  5  b

需要基于A列合并(仅保留所有DataFrame共有的A值),并将不同DataFrame中同A值的行交错排列,得到如下结果:

A  B
0  1  a
0  1  b
1  2  a
1  2  b
2  3  a
2  3  b

常规merge方法会将列并排,无法满足需求,同时需要支持3个及以上DataFrame的处理。


解决方案步骤

  1. 为每个DataFrame添加临时标识列,区分不同数据源
  2. 合并所有DataFrame
  3. 筛选出所有DataFrame共有的A值(取交集)
  4. 按A列和数据源标识排序,实现同A值的行交错排列
  5. 调整索引至目标格式,移除临时标识列

代码实现

import pandas as pd

# 示例DataFrame
df1 = pd.DataFrame({'A': [1,2,3,4], 'B': ['a','a','a','a']})
df2 = pd.DataFrame({'A': [1,2,3,5], 'B': ['b','b','b','b']})
df3 = pd.DataFrame({'A': [1,2,3,6], 'B': ['c','c','c','c']})  # 支持扩展到3个及以上DF

# 将所有需要处理的DataFrame存入列表
dfs = [df1, df2, df3]

# 为每个DF添加数据源标识并合并
dfs_with_source = [df.assign(source=i) for i, df in enumerate(dfs)]
combined = pd.concat(dfs_with_source)

# 筛选所有DF共有的A值
common_A = set.intersection(*[set(df['A']) for df in dfs])
combined = combined[combined['A'].isin(common_A)]

# 按A列和数据源排序,确保同A值的行交错排列
combined = combined.sort_values(by=['A', 'source'])

# 生成目标索引:每个A值对应统一的索引编号
combined['new_index'] = combined.groupby('A').ngroup()

# 调整索引并移除临时列
result = combined.set_index('new_index').drop('source', axis=1)
print(result)

3个DataFrame的输出结果

A  B
new_index     
0         1  a
0         1  b
0         1  c
1         2  a
1         2  b
1         2  c
2         3  a
2         3  b
2         3  c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:35:42