如何在Pandas中使用df.apply将行传递给自定义函数
如何在Pandas中使用df.apply将行传递给自定义函数
嗨,我来帮你搞定这个问题!你碰到的KeyError: 'rec_id',本质原因是**df.apply()默认是按列处理数据的**,而不是你期望的按行传递。
咱们来拆解一下:当你直接调用df.apply(testapply)时,Pandas会把每一列作为一个Series对象传给testapply函数,而不是每一行。这时候函数里的row其实是某一列的数据,自然找不到'rec_id'这个键啦。
解决方案:指定axis=1参数
只需要在apply方法里加上axis=1,就能告诉Pandas“按行来处理,把每一行作为参数传给函数”。修改后的代码如下:
def testapply(row): print(row) if row['rec_id'] < 863238: return "X" # 补充等于的情况,避免遗漏 elif row['rec_id'] > 863238 : return "Y" else: return "Z" data = {'Name': ['Alice', 'Bob', 'Charlie'], 'rec_id': [2532, 863238, 2212]} df = pd.DataFrame(data) # 关键:加上axis=1参数 df['result'] = df.apply(testapply, axis=1) print(df)
运行这段代码后,每一行的Series会被传给testapply,你就可以通过row['rec_id']或者row.rec_id(两种写法都可行)轻松访问列值了。
额外小提示
如果你的函数只需要用到特定的几列,也可以直接传递这些列,这样可能更高效。比如:
# 假设函数只需要rec_id列的数据 def test_simple(rec_id): if rec_id < 863238: return "X" elif rec_id > 863238: return "Y" else: return "Z" df['result'] = df['rec_id'].apply(test_simple)
不过如果需要同时用到多列数据,那按行传递(指定axis=1)就是最方便的方式啦。
备注:内容来源于stack exchange,提问作者Stumbling Through Data Science
相关产品推荐
相关产品推荐

