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

