Pandas DataFrame应用函数,多个参数

时间:2017-03-28 18:44:57

标签: python pandas dataframe apply

我有一个Pandas数据帧,其中一列是字符串。我从外部模块导入了一个函数来执行一些RegEx检查,并将此字符串缩减为一个简短的分类。

这有效:

df['PageCLass'] = df['PageClass'].apply(lambda x: PageClassify.page_classify(x))

然而,我真正想做的是在数据框中加入另一列'Rev',它恰好是一个浮点数或NaN进入检查。

当我这样做时:

df['PageCLass'] = df['PageClass'].apply(lambda x: PageClassify.page_classify(x,df['Rev']))

我正在第二个参数的分类函数中进行逻辑检查,我收到了这个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我正在寻找的是一种通过值捕获第二个参数值的方法,就像lambda x:按值捕获第一个参数值。

2 个答案:

答案 0 :(得分:1)

假设您想要逐行执行此操作,以下操作应该有效:

df['PageCLass'] = (df['PageClass'] + df['Rev'].apply(str)).apply(lambda x: PageClassify.page_classify(x))

在这里,您只需将两个数据帧列连接在一起,然后就可以将该函数应用于新列中的每一行。如果你需要检查PageClass和Rev的值作为单独的参数,你还可以在连接中添加一个分隔符(例如'\ t'),然后简单地在函数内部拆分:

df['PageCLass'] = (df['PageClass'] + '\t' + df['Rev'].apply(str)).apply(lambda x: PageClassify.page_classify(x))

希望这有帮助!

答案 1 :(得分:1)

上面的方法是可以的,我猜它是否有效......在我看来,它没有回答这个问题,因为你将两个参数连成一个。

这样做的一种方法是允许你传递两个参数来应用:

df['PageCLass'] = df[['PageClass','Rev']].apply(lambda x: PageClassify.page_classify(*x), axis=1)

我不知道page_classify方法是什么样的,但如果它需要两个参数,则上述应该有效。这对你有用吗?