Python中如何从拼接后的DataFrame恢复原始A_1和A_2?
恢复纵向拼接前的原始DataFrame
问题根源
你尝试用A_concat[1]、A_concat[2]拆分是错误的——pd.concat(axis=0)是行方向堆叠,结果是把A_1的所有行放在A_2前面,而A_concat[X]是按列索引/列名取值,和行拆分完全无关,自然拿不到原始DataFrame。
两种正确拆分方法
方法1:利用原始DataFrame的行数拆分
如果还能获取A_1、A_2的原始行数,直接用iloc按行范围切片:
# 获取A_1的行数 a1_rows = len(A_1) # 拆分出原始A_1 restored_A1 = A_concat.iloc[:a1_rows, :] # 拆分出原始A_2 restored_A2 = A_concat.iloc[a1_rows:, :]
方法2:拼接时预留标识,后续精准拆分
如果不确定原始行数,或者需要更清晰的溯源,可以在拼接时通过keys参数给两个DataFrame打标签,之后提取:
# 拼接时添加层级索引标记来源 A_concat = pd.concat([A_1, A_2], axis=0, keys=['source_A1', 'source_A2']) # 方式A:用xs快速提取 restored_A1 = A_concat.xs('source_A1', level=0) restored_A2 = A_concat.xs('source_A2', level=0) # 方式B:用groupby遍历拆分 for label, df in A_concat.groupby(level=0): if label == 'source_A1': restored_A1 = df.reset_index(level=0, drop=True) # 移除层级索引 else: restored_A2 = df.reset_index(level=0, drop=True)
reset_index(level=0, drop=True)是为了去掉拼接时新增的层级索引,让恢复后的DataFrame和原始结构完全一致。
补充说明
如果拼接后做过行索引重置(比如用了ignore_index=True),方法1依然有效,只要你保留了原始A_1的行数;方法2则需要在拼接时就指定keys,否则无法追溯来源。
内容的提问来源于stack exchange,提问作者NN_Developer
相关产品推荐
相关产品推荐

