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

如何用Python DataFrame为特定值('c')生成规则递增的新列?

实现方案

针对你的需求,我们可以用两种方式实现:利用pandas处理结构化数据,或者纯Python列表遍历处理。

方法一:使用pandas(推荐用于批量数据处理)

pandas能高效处理这类分组标记需求,步骤如下:

import pandas as pd

# 构造原始数据集
data = ['a', 'c', 'c', 'd', 'b', 'a', 'a', 'd', 'd', 'c', 'c', 'b', 'a', 'b']
df = pd.DataFrame({'原始列': data})

# 标记当前行是否为'c'
df['是否为c'] = df['原始列'] == 'c'
# 标记块的起始位置(当前行与上一行类型不同时标记)
df['块起始'] = df['是否为c'].ne(df['是否为c'].shift())
# 生成块编号
df['块ID'] = df['块起始'].cumsum()

# 为非c块分配递增编号
非c块列表 = df[~df['是否为c']]['块ID'].unique()
块编号映射 = {块ID: 编号+1 for 编号, 块ID in enumerate(非c块列表)}

# 生成目标列
df['新列'] = df.apply(lambda row: 0 if row['是否为c'] else 块编号映射[row['块ID']], axis=1)

# 查看结果(保留关键列)
print(df[['原始列', '新列']].to_string(index=False))

执行后输出与示例一致:

原始列  新列
    a    1
    c    0
    c    0
    d    2
    b    2
    a    2
    a    2
    d    2
    d    2
    c    0
    c    0
    b    3
    a    3
    b    3

方法二:纯Python列表遍历

如果不需要结构化数据处理,直接遍历列表也能实现:

data = ['a', 'c', 'c', 'd', 'b', 'a', 'a', 'd', 'd', 'c', 'c', 'b', 'a', 'b']
new_col = []
current_num = 1
in_non_c_block = False

for idx, val in enumerate(data):
    if val == 'c':
        new_col.append(0)
        # 离开非c块时,下一个非c块编号递增
        if in_non_c_block:
            current_num += 1
            in_non_c_block = False
    else:
        # 进入新的非c块(首行或前一行是c)
        if idx == 0 or data[idx-1] == 'c':
            new_col.append(current_num)
            in_non_c_block = True
        else:
            # 同一非c块,保持当前编号
            new_col.append(current_num)

# 打印结果
for orig, new_val in zip(data, new_col):
    print(f"{orig}   {new_val}")

运行后同样会输出你需要的结果。

内容的提问来源于stack exchange,提问作者Akshat Srivastav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:05:32