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

如何按连续索引、小写开头规则合并DataFrame的Animal列多行数据

Pandas 按规则合并相邻行的实现方案

核心判断逻辑

要完成指定的合并,首先要明确分组边界:只有当**当前行同时满足「与上一行的原始索引差值为1」、「当前行Animal值去空格后首字符为小写」**两个条件时,才需要和上一行归为同一组,否则作为新分组的起点。所有同组的Animal值按原顺序拼接后,重新生成连续索引即可。


方案1:累计求和生成分组键(性能最优,适合大数据集)

这个方案是Pandas做相邻行分组的标准写法,向量化运算的性能远高于逐行循环,数据量上万时优势非常明显。

具体实现代码

  1. 构造与示例一致的输入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]
)
  1. 保留原始索引为独立列,避免默认连续索引干扰连续性判断:
# 将原无规则的索引转为普通列,不改变原有行顺序
df = df.reset_index(names="orig_idx")
  1. 逐行计算是否需要与上一行合并:
# 判断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
  1. 生成分组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:45:02