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

如何用Pandas按class对齐拼接DataFrame生成表格报告

解决方案

要实现按class对齐两个DataFrame的需求,可以通过给每个分组添加行号,再进行外连接来实现,具体步骤如下:

步骤1:给每个DataFrame添加组内行号

对两个DataFrame按class分组,生成组内的连续行号,用来对齐同class下的条目:

import pandas as pd

# 原始数据
df1 = pd.DataFrame({
    'class': ['A', 'A', 'B', 'X'],
    'item': ['_1', '_2', '_3', '_4'],
    'value': [10, 11, 12, 13]
})

df2 = pd.DataFrame({
    'class': ['A', 'B', 'B', 'C'],
    'item': ['_5', '_6', '_7', '_8'],
    'value': [20, 21, 22, 23]
})

# 添加组内行号
df1['row_num'] = df1.groupby('class').cumcount()
df2['row_num'] = df2.groupby('class').cumcount()

步骤2:重命名列以区分两个DataFrame

为了合并后能区分来自df1和df2的字段,重命名相关列:

df1_renamed = df1.rename(columns={'item': 'item_1', 'value': 'value_1'})
df2_renamed = df2.rename(columns={'item': 'item_2', 'value': 'value_2'})

步骤3:按class和行号外连接

使用pd.merge进行外连接,确保所有class和条目都被保留:

result = pd.merge(df1_renamed, df2_renamed, on=['class', 'row_num'], how='outer')

步骤4:整理结果格式

去掉临时的row_num列,重置索引,调整列顺序到目标格式:

result = result.drop('row_num', axis=1)[['class', 'item_1', 'value_1', 'item_2', 'value_2']].reset_index(drop=True)

执行完上述代码后,result就会得到你需要的格式:

class item_1  value_1 item_2  value_2
0     A     _1     10.0     _5     20.0
1     A     _2     11.0    NaN      NaN
2     B     _3     12.0     _6     21.0
3     B    NaN      NaN     _7     22.0
4     C    NaN      NaN     _8     23.0
5     X     _4     13.0    NaN      NaN

如果需要将数值列的NaN显示为空或者其他格式,可以按需处理,比如:

result[['value_1', 'value_2']] = result[['value_1', 'value_2']].fillna('').astype(object)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:26:13