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

如何拆分经pd.concat合并并转换后的Pandas DataFrame?

嘿,我来帮你搞定这个拆分的问题!要把经过func处理后的X_transformed拆回原始的两个DataFrame,核心得看你的func操作有没有改动DataFrame的行数,下面分两种常见场景给你具体方案:

拆分合并后的DataFrame回原始两个DataFrame

情况1:func没修改行数(比如仅做列变换、标准化等)

这种情况最省心,因为你是用pd.concat按行合并的data1和data2,合并后的X行数就是两者的行数之和。只要提前记录好原始两个DataFrame的行数,直接对X_transformed做切片就行:

import numpy as np
import pandas as pd

# 构建原始数据(这里顺便把字符串转成数值类型,避免后续操作出问题)
data1 = np.array([['','Col1','Col2'],['1',1,2],['2',3,4]])
data1 = pd.DataFrame(data=data1[1:,1:], index=data1[1:,0], columns=data1[0,1:]).astype(int)
data2 = np.array([['','Col1','Col2'],['1',5,6],['2',7,8]])
data2 = pd.DataFrame(data=data2[1:,1:], index=data2[1:,0], columns=data2[0,1:]).astype(int)

# 提前记录两个原始DataFrame的行数
len_data1 = len(data1)
len_data2 = len(data2)

# 合并并处理
X = pd.concat([data1, data2], axis=0)
# 示例func:给DataFrame新增一列(不改变行数)
def func(df):
    df['Col3'] = df['Col1'] + df['Col2']
    return df
X_transformed = func(X)

# 拆分回原始两个DataFrame
data1_transformed = X_transformed.iloc[:len_data1, :]
data2_transformed = X_transformed.iloc[len_data1:, :]

print("转换后的data1:\n", data1_transformed)
print("转换后的data2:\n", data2_transformed)

情况2:func可能修改行数(比如过滤、分组聚合等)

如果func会增减行数,切片法就失效了。这时候最优方案是在合并前给每个DataFrame加一个分组标识列,后续通过这个标识来拆分:

import numpy as np
import pandas as pd

# 构建原始数据
data1 = np.array([['','Col1','Col2'],['1',1,2],['2',3,4]])
data1 = pd.DataFrame(data=data1[1:,1:], index=data1[1:,0], columns=data1[0,1:]).astype(int)
data2 = np.array([['','Col1','Col2'],['1',5,6],['2',7,8]])
data2 = pd.DataFrame(data=data2[1:,1:], index=data2[1:,0], columns=data2[0,1:]).astype(int)

# 给每个DataFrame添加分组标识
data1['source'] = 'data1'
data2['source'] = 'data2'

# 合并并处理
X = pd.concat([data1, data2], axis=0)
# 示例func:过滤掉Col1<=3的行(会减少行数)
def func(df):
    return df[df['Col1'] > 3]
X_transformed = func(X)

# 按标识拆分,最后去掉标识列还原原始结构
data1_transformed = X_transformed[X_transformed['source'] == 'data1'].drop('source', axis=1)
data2_transformed = X_transformed[X_transformed['source'] == 'data2'].drop('source', axis=1)

print("转换后的data1:\n", data1_transformed)
print("转换后的data2:\n", data2_transformed)

小提醒

要是你之前没提前加标识、也没记录原始行数,而且func已经改动了行数,那基本没法准确拆分了——因为合并后的DataFrame已经丢失了“哪些行来自data1/data2”的信息。所以提前做标识或者记录行数是关键哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:16:34