如何用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
相关产品推荐
相关产品推荐

