假设我有一个包含'ID', 'col_1', 'col_2'
列的df
。我定义了一个函数:
f = lambda x, y : my_function_expression
。
现在,我想将f
应用于df
的两个列'col_1', 'col_2'
,以逐个元素地计算一个新列'col_3'
,类似于:
df['col_3'] = df[['col_1','col_2']].apply(f)
# Pandas gives : TypeError: ('<lambda>() takes exactly 2 arguments (1 given)'
怎么办?
**添加细节示例如下*
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']
发布于 2012-11-12 09:39:10
这是一个在数据帧上使用apply
的示例,我用axis = 1
调用它。
请注意,不同之处在于,不是尝试将两个值传递给函数f
,而是重写该函数以接受pandas Series对象,然后对Series进行索引以获取所需的值。
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
会很有帮助。
发布于 2018-10-17 20:22:47
在Pandas中有一种简洁的、一行的方式来完成这项工作:
df['col_3'] = df.apply(lambda x: f(x.col_1, x.col_2), axis=1)
这允许f
成为具有多个输入值的用户定义函数,并使用(安全的)列名而不是(不安全的)数字索引来访问列。
带数据的示例(基于原始问题):
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)
的输出
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属性共享一个名称,则可以使用方括号进行索引:
df['col_3'] = df.apply(lambda x: f(x['col 1'], x['col 2']), axis=1)
发布于 2016-09-01 05:39:46
一个简单的解决方案是:
df['col_3'] = df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)
https://stackoverflow.com/questions/13331698
复制相似问题