假设我有一个df,它的列是" ID " " col_1 " " col_2 "我定义了一个函数:
F = 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']
您正在寻找的方法是Series.combine。
然而,在数据类型方面似乎需要多加注意。
在您的示例中,您会(就像我在测试答案时那样)天真地调用
df['col_3'] = df.col_1.combine(df.col_2, func=get_sublist)
但是,这会抛出错误:
ValueError: setting an array element with a sequence.
我最好的猜测是,它似乎期望结果与调用方法的系列(df。col_1这里)。然而,以下工作:
df['col_3'] = df.col_1.astype(object).combine(df.col_2, func=get_sublist)
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]
您正在寻找的方法是Series.combine。
然而,在数据类型方面似乎需要多加注意。
在您的示例中,您会(就像我在测试答案时那样)天真地调用
df['col_3'] = df.col_1.combine(df.col_2, func=get_sublist)
但是,这会抛出错误:
ValueError: setting an array element with a sequence.
我最好的猜测是,它似乎期望结果与调用方法的系列(df。col_1这里)。然而,以下工作:
df['col_3'] = df.col_1.astype(object).combine(df.col_2, func=get_sublist)
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]
在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)
打印输出(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)
一个有趣的问题!我的回答如下:
import pandas as pd
def sublst(row):
return lst[row['J1']:row['J2']]
df = pd.DataFrame({'ID':['1','2','3'], 'J1': [0,2,3], 'J2':[1,4,5]})
print df
lst = ['a','b','c','d','e','f']
df['J3'] = df.apply(sublst,axis=1)
print df
输出:
ID J1 J2
0 1 0 1
1 2 2 4
2 3 3 5
ID J1 J2 J3
0 1 0 1 [a]
1 2 2 4 [c, d]
2 3 3 5 [d, e]
我将列名更改为ID,J1,J2,J3,以确保ID < J1 < J2 < J3,因此列以正确的顺序显示。
再简单说一下:
import pandas as pd
df = pd.DataFrame({'ID':['1','2','3'], 'J1': [0,2,3], 'J2':[1,4,5]})
print df
lst = ['a','b','c','d','e','f']
df['J3'] = df.apply(lambda row:lst[row['J1']:row['J2']],axis=1)
print df