如何用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
相关产品推荐
相关产品推荐

