我需要将几个函数应用于数据框行。这些函数的参数从单行的两个或多个字段中获取值。例如:
d = {
'a': [1,1,1,1],
'b': [2,2,2,2],
'c': [3,3,3,3],
'd': [4,4,4,4]
}
df1 = pd.DataFrame(d)
def f1(x,y):
return x + 2*y
def f2(x,y):
return y + 2*x
df2 = pd.DataFrame()
df2['val1'] = df1.apply(lambda r: f1(r.a, r.b),1)
df2['val2'] = df1.apply(lambda r: f2(r.c, r.d),1)
当依次应用每个函数时,Pandas会对所有数据帧行进行单独的迭代。在此示例中,Pandas迭代数据帧两次。结果我得到了:
In [10]: df2
Out[10]:
val1 val2
0 5 10
1 5 10
2 5 10
3 5 10
有没有办法在数据帧的单次传递中应用这样的两个或更多函数?这样应用程序应该为一行中的多个字段返回值。此外,这种情况包括应用单个函数返回多于一个字段的值。怎么办呢?
答案 0 :(得分:1)
您可以通过组合您的功能同时填写它们:
def f3(x,y,z,a):
return x + 2*y, a + 2*z
df3 = pd.DataFrame()
df3['val1'], df3['val2'] = f3(df1.a, df1.b, df1.c, df1.d)
答案 1 :(得分:0)
如果你的函数是线性的或者可以用某种方式进行矢量化,我们可以做很多很酷的事情。
t = pd.DataFrame(dict(val1=[1, 2, 0, 0], val2=[0, 0, 2, 1]), df1.columns)
df1.dot(t)
或者更快
pd.DataFrame(
df1.values.dot(
np.array([[1, 0], [2, 0], [0, 2], [0, 1]])
),
df1.index,
['val1', 'val2']
)
或者您可以定义要应用的新功能
def f3(r):
return pd.Series(dict(val1=f1(r.a, r.b), val2=f2(r.c, r.d)))
df1.apply(f3, 1)
答案 2 :(得分:0)
如果您不想创建新功能,可以使用下面的单行代码:
>>> df2 = df1.apply(lambda r: pd.Series({'val1': f1(r.a, r.b), 'val2': f2(r.c, r.d)}), axis=1)
>>> df2
val1 val2
0 5 10
1 5 10
2 5 10
3 5 10