Pandas拼接三个DataFrame时自动对齐行数删除多余行的方法
Pandas多DataFrame自动对齐尾部行数方案
Pandas没有提供专门用于跨DataFrame批量裁剪对齐行数的独立内置方法,但不需要写冗长的if-else分支判断,用基础的位置索引功能就能实现通用的自动对齐逻辑,完全适配按行拼接的需求。
最简实现代码
手动删指定索引的方式本质是只保留所有df共有的前N行、丢弃尾部多余行,这个逻辑可以通用化:
import pandas as pd df_ch = pd.read_csv("./file1.csv") df_wr = pd.read_csv("./file2.csv") df_an = pd.read_csv("./file3.csv") # 先取三个DataFrame的最小行数值 min_rows = min(len(df_ch), len(df_wr), len(df_an)) # 用iloc做位置裁剪,所有df统一保留前min_rows行,尾部多余行自动丢弃 df_ch = df_ch.iloc[:min_rows] df_wr = df_wr.iloc[:min_rows] df_an = df_an.iloc[:min_rows]
这个写法的优势:
- 不需要提前判断哪个df行数少、哪个df多了几行,不管是单文件多45行,还是两个文件各多23行,都能自动适配
iloc是按位置切片,不受原DataFrame索引是否连续、是否有重复值影响,不会出现行错位问题,和手动删尾部行的逻辑完全一致- 后续如果要增加更多csv文件参与对齐,只需要把对应df的长度加入
min()的计算,补一行切片代码即可
可复用封装版本
如果需要频繁做这类对齐,可以封装成通用函数,一次处理任意数量的DataFrame:
def align_tail_to_min(*input_dfs, reset_index=True): """ 将输入的所有DataFrame按尾部裁剪到最短长度,返回对齐后的df列表 :param reset_index: 是否重置对齐后df的索引,避免拼接时出现索引重复 """ min_length = min(len(df) for df in input_dfs) aligned_dfs = [] for df in input_dfs: cut_df = df.iloc[:min_length] if reset_index: cut_df = cut_df.reset_index(drop=True) aligned_dfs.append(cut_df) return aligned_dfs # 调用示例 df_ch, df_wr, df_an = align_tail_to_min(df_ch, df_wr, df_an)
注意:该方案的前提是三个csv的行顺序天然一一对应,多余行仅出现在文件尾部,和手动删除的场景假设一致。如果多余行随机出现在文件中部,需要先基于唯一行键做匹配合并,不能直接裁行。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

