如何在Pandas DataFrame中按行重置含"A"的单元格数字序号
解决方案
初始数据
import pandas as pd data = {'column1': ['A1', 'A1', 'A1', 'A1'], 'column2': ['A9', 'A1', 'A8', 'A1'], 'column3': ['D1', 'D1', 'D1', 'D1'], 'column4': ['A6', 'A2', 'A3', 'A4'], 'column5': ['H1', 'H1', 'H1', 'H1'], 'column6': ['A4', '', '', 'A3'], 'column7': ['A5', '', '', 'A9']} df = pd.DataFrame(data)
初始表格:
| column1 | column2 | column3 | column4 | column5 | column6 | column7 |
|---|---|---|---|---|---|---|
| A1 | A9 | D1 | A6 | H1 | A4 | A5 |
| A1 | A1 | D1 | A2 | H1 | ||
| A1 | A8 | D1 | A3 | H1 | ||
| A1 | A1 | D1 | A4 | H1 | A3 | A9 |
需求
按行重置所有包含"A"的值的数字部分,从A1开始;若同一行中再次出现A1,则保留该单元格内容,继续处理下一个单元格;不含"A"的值和空白单元格需忽略。
实现代码
def process_row(row): a_count = 0 has_a1 = False processed = [] for val in row: if val == '': processed.append(val) continue if not val.startswith('A'): processed.append(val) continue if val == 'A1': if not has_a1: has_a1 = True a_count = 1 processed.append(val) else: a_count += 1 processed.append(f'A{a_count}') return pd.Series(processed, index=row.index) df_processed = df.apply(process_row, axis=1)
处理后结果
| column1 | column2 | column3 | column4 | column5 | column6 | column7 |
|---|---|---|---|---|---|---|
| A1 | A2 | D1 | A3 | H1 | A4 | A5 |
| A1 | A1 | D1 | A2 | H1 | ||
| A1 | A2 | D1 | A3 | H1 | ||
| A1 | A1 | D1 | A2 | H1 | A3 | A4 |
代码说明
- 定义
process_row函数处理单行数据:- 用
a_count记录当前要分配的A序号,has_a1标记该行是否已出现过A1 - 遍历每个单元格:
- 空白单元格直接保留
- 非A开头的单元格直接保留原内容
- 遇到"A1"时,若首次出现则标记并初始化序号为1,直接保留"A1";非首次出现也直接保留
- 其他A开头的单元格,序号自增后生成新的"A+数字"格式内容
- 用
- 使用
df.apply(..., axis=1)按行应用处理函数,得到最终结果
内容的提问来源于stack exchange,提问作者Led
相关产品推荐
相关产品推荐

