如何按连续索引、小写开头规则合并DataFrame的Animal列多行数据
Pandas 按规则合并相邻行的实现方案
核心判断逻辑
要完成指定的合并,首先要明确分组边界:只有当**当前行同时满足「与上一行的原始索引差值为1」、「当前行Animal值去空格后首字符为小写」**两个条件时,才需要和上一行归为同一组,否则作为新分组的起点。所有同组的Animal值按原顺序拼接后,重新生成连续索引即可。
方案1:累计求和生成分组键(性能最优,适合大数据集)
这个方案是Pandas做相邻行分组的标准写法,向量化运算的性能远高于逐行循环,数据量上万时优势非常明显。
具体实现代码
- 构造与示例一致的输入DataFrame:
import pandas as pd df = pd.DataFrame( {"Animal": ["Bulldog", "hatcet ", "Parrot ", "Carrot ", "Jack Dog", "Kanggaroo", "helma "]}, index=[0, 1, 3, 7, 8, 9, 10] )
- 保留原始索引为独立列,避免默认连续索引干扰连续性判断:
# 将原无规则的索引转为普通列,不改变原有行顺序 df = df.reset_index(names="orig_idx")
- 逐行计算是否需要与上一行合并:
# 判断1:当前行原始索引比上一行大1,即索引连续 is_index_continuous = df["orig_idx"].diff().eq(1) # 判断2:当前行Animal值去首尾空格后,首字符为小写 is_lower_start = df["Animal"].str.strip().str[0].str.islower() # 两个条件同时满足时,当前行需要合并到上一行 need_merge = is_index_continuous & is_lower_start
- 生成分组ID、聚合得到最终结果:
# 不需要合并的行即为新分组起点,对新起点标记累计求和得到固定分组号 group_id = (~need_merge).cumsum() # 按分组拼接字符串,重置为连续无缺失的索引 result = ( df.groupby(group_id, as_index=False) .agg(Animal=("Animal", lambda s: " ".join(s))) .drop(columns="orig_idx") )
运行后输出的结果与示例期望效果完全一致。
方案2:逐行循环处理(逻辑直观,适合复杂自定义规则)
如果后续需要调整的合并规则比较复杂,逐行遍历的方式更方便调试和自定义,数据量在千行级的时候性能完全够用。
具体实现代码
承接上面步骤2中已将原始索引转为orig_idx列的DataFrame:
result_list = [] # 以第一行作为初始待合并基准 current_animal = df.loc[0, "Animal"] current_orig_idx = df.loc[0, "orig_idx"] # 从第二行开始逐行判断 for _, row in df.iloc[1:].iterrows(): # 同时满足两个合并条件时,拼接到当前基准行 if (row["orig_idx"] == current_orig_idx + 1) and row["Animal"].strip()[0].islower(): current_animal = f"{current_animal} {row['Animal']}" current_orig_idx = row["orig_idx"] else: # 不满足合并条件时,将当前基准行存入结果,切换为新的基准行 result_list.append(current_animal) current_animal = row["Animal"] current_orig_idx = row["orig_idx"] # 存入最后一行基准内容 result_list.append(current_animal) # 生成最终DataFrame result_loop = pd.DataFrame({"Animal": result_list})
常见避坑点
- 不要用Pandas默认生成的连续索引判断相邻性:必须把原始的不规则索引提取为独立列计算差值,否则会把本不连续的行误判为相邻。
- 判断小写开头前必须先去除字符串首尾空格:示例输入中的
hatcet、helma都带前后空格,直接取首字符会因为取到空格导致判断失效。 - 拼接字符串时不要随意修改原内容:聚合时直接用原始字符串拼接,不要提前strip去掉原有的空格,否则会和示例输出的格式有差异。
内容的提问来源于stack exchange,提问作者user14529296
相关产品推荐
相关产品推荐

