首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将函数应用于两列Pandas数据帧

如何将函数应用于两列Pandas数据帧
EN

Stack Overflow用户
提问于 2012-11-11 21:48:53
回答 14查看 724K关注 0票数 546

假设我有一个包含'ID', 'col_1', 'col_2'列的df。我定义了一个函数:

f = lambda x, y : my_function_expression

现在,我想将f应用于df的两个列'col_1', 'col_2',以逐个元素地计算一个新列'col_3',类似于:

代码语言:javascript
复制
df['col_3'] = df[['col_1','col_2']].apply(f)  
# Pandas gives : TypeError: ('<lambda>() takes exactly 2 arguments (1 given)'

怎么办?

**添加细节示例如下*

代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame({'ID':['1','2','3'], 'col_1': [0,2,3], 'col_2':[1,4,5]})
mylist = ['a','b','c','d','e','f']

def get_sublist(sta,end):
    return mylist[sta:end+1]

#df['col_3'] = df[['col_1','col_2']].apply(get_sublist,axis=1)
# expect above to output df as below 

  ID  col_1  col_2            col_3
0  1      0      1       ['a', 'b']
1  2      2      4  ['c', 'd', 'e']
2  3      3      5  ['d', 'e', 'f']
EN

回答 14

Stack Overflow用户

发布于 2012-11-12 09:39:10

这是一个在数据帧上使用apply的示例,我用axis = 1调用它。

请注意,不同之处在于,不是尝试将两个值传递给函数f,而是重写该函数以接受pandas Series对象,然后对Series进行索引以获取所需的值。

代码语言:javascript
复制
In [49]: df
Out[49]: 
          0         1
0  1.000000  0.000000
1 -0.494375  0.570994
2  1.000000  0.000000
3  1.876360 -0.229738
4  1.000000  0.000000

In [50]: def f(x):    
   ....:  return x[0] + x[1]  
   ....:  

In [51]: df.apply(f, axis=1) #passes a Series object, row-wise
Out[51]: 
0    1.000000
1    0.076619
2    1.000000
3    1.646622
4    1.000000

根据您的用例,有时创建一个pandas group对象,然后在组上使用apply会很有帮助。

票数 433
EN

Stack Overflow用户

发布于 2018-10-17 20:22:47

在Pandas中有一种简洁的、一行的方式来完成这项工作:

代码语言:javascript
复制
df['col_3'] = df.apply(lambda x: f(x.col_1, x.col_2), axis=1)

这允许f成为具有多个输入值的用户定义函数,并使用(安全的)列名而不是(不安全的)数字索引来访问列。

带数据的示例(基于原始问题):

代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame({'ID':['1', '2', '3'], 'col_1': [0, 2, 3], 'col_2':[1, 4, 5]})
mylist = ['a', 'b', 'c', 'd', 'e', 'f']

def get_sublist(sta,end):
    return mylist[sta:end+1]

df['col_3'] = df.apply(lambda x: get_sublist(x.col_1, x.col_2), axis=1)

print(df)的输出

代码语言:javascript
复制
  ID  col_1  col_2      col_3
0  1      0      1     [a, b]
1  2      2      4  [c, d, e]
2  3      3      5  [d, e, f]

如果您的列名包含空格或与现有的dataframe属性共享一个名称,则可以使用方括号进行索引:

代码语言:javascript
复制
df['col_3'] = df.apply(lambda x: f(x['col 1'], x['col 2']), axis=1)
票数 402
EN

Stack Overflow用户

发布于 2016-09-01 05:39:46

一个简单的解决方案是:

代码语言:javascript
复制
df['col_3'] = df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)
票数 132
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13331698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档