使用Lambda函数处理Pandas DataFrame条件赋值时的报错问题求助
问题分析与解决
错误原因
你写的代码报错是因为**df['b'].apply()的lambda参数x是b列的单个数值**,它没有a属性——你试图从一个整数里获取a列的值,这显然行不通。
正确实现方式
方法1:逐行处理(apply+axis=1)
把apply作用于整个DataFrame,指定axis=1让lambda接收整行数据,这样就能同时访问a和b列的值:
import pandas as pd import random df = pd.DataFrame({'a': ['Yes', 'No', 'Yes','Yes'], 'b': [1, 0, 0,0]}) # 对整行应用逻辑,替换符合条件的b值 df['b'] = df.apply(lambda row: random.randint(1,15) if row['a'] == 'Yes' and row['b'] == 0 else row['b'], axis=1) print(df)
方法2:布尔索引批量处理(推荐)
用布尔索引筛选出需要替换的行,直接批量赋值随机数,这种方法比逐行apply效率更高,适合大数据集:
import pandas as pd import random df = pd.DataFrame({'a': ['Yes', 'No', 'Yes','Yes'], 'b': [1, 0, 0,0]}) # 生成筛选条件:a为Yes且b为0 mask = (df['a'] == 'Yes') & (df['b'] == 0) # 给符合条件的行的b列赋值1-15的随机整数 df.loc[mask, 'b'] = [random.randint(1,15) for _ in range(df[mask].shape[0])] print(df)
输出示例
运行后会得到符合期望的结果(随机数每次运行不同):
a b 0 Yes 1 1 No 0 2 Yes 12 3 Yes 5
内容的提问来源于stack exchange,提问作者VKS
相关产品推荐
相关产品推荐

