如何在Pandas中遍历行并在两列相等时应用函数
How to apply a specific function to rows where 'start' equals 'end' in a pandas DataFrame?
Problem Statement
我有如下结构的DataFrame:
import pandas as pd inp = [{'ID':"a", 'start':100, 'end': 200}, {'ID':"b", 'start':250, 'end': 290}, {'ID':"c", 'start':300, 'end': 300}, {'ID':"d", 'start':350, 'end': 500}, {'ID':"e", 'start':600, 'end': 600}, {'ID':"f", 'start':700, 'end': 900}] df = pd.DataFrame(inp) df[['ID','start','end']]输出的DataFrame如下:
ID start end 0 a 100 200 1 b 250 290 2 c 300 300 3 d 350 500 4 e 600 600 5 f 700 900我希望遍历该DataFrame的每一行,当start列与end列数值相等时对该行应用指定函数,请问该如何实现?
Solutions
首先先定义一个示例的指定函数,你可以根据自己的需求修改逻辑:
def my_custom_function(row): # 示例操作:给ID添加后缀,你可以替换成自己的业务逻辑 row['ID'] = f"{row['ID']}_updated" # 也可以添加新列、修改其他字段等 row['status'] = 'same_start_end' return row
方法1:布尔索引 + 定向应用(推荐,高效)
这种方法先筛选出符合条件的行,只对这些行执行函数,避免遍历整个数据集,在数据量大的时候性能优势明显:
# 生成筛选条件:start和end相等的行 condition_mask = df['start'] == df['end'] # 对符合条件的行应用函数,再赋值回原DataFrame df.loc[condition_mask] = df.loc[condition_mask].apply(my_custom_function, axis=1)
执行后,你会看到ID为c和e的行已经被修改,新增了status列,其他行保持原样。
方法2:遍历所有行并判断(适合小数据集)
如果你的数据集很小,也可以直接用apply遍历每一行,通过条件判断决定是否执行函数:
df = df.apply( lambda row: my_custom_function(row) if row['start'] == row['end'] else row, axis=1 )
这种写法更直观,但会遍历每一行,数据量大时效率不如方法1,所以优先推荐第一种方案。
补充:如果函数仅生成单个值
如果你的函数只是计算某个单一值(比如基于start生成新字段),可以更简洁地赋值:
def calculate_value(row): return row['start'] * 3 # 直接给符合条件的行的新列赋值 df.loc[condition_mask, 'calculated_col'] = df.loc[condition_mask].apply(calculate_value, axis=1)
内容的提问来源于stack exchange,提问作者RJF
相关产品推荐
相关产品推荐

