Python Pandas:将函数应用于数据框行时返回多个字段值

时间:2016-12-24 15:42:02

标签: python pandas dataframe

我需要将几个函数应用于数据框行。这些函数的参数从单行的两个或多个字段中获取值。例如:

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                                                                                               

有没有办法在数据帧的单次传递中应用这样的两个或更多函数?这样应用程序应该为一行中的多个字段返回值。此外,这种情况包括应用单个函数返回多于一个字段的值。怎么办呢?

3 个答案:

答案 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']
)

enter image description here

或者您可以定义要应用的新功能

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