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

3

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

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个回答

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
这是一个不错的方法,虽然并非每个函数都可以在dataFrame上像这样运行。 也可以这样做:df3['val1'], df3['val2'] = f1(df1.a, df1.b), f2(df1.c, df1.d) - Roman Pekar
无法使用我的真实函数和参数。我收到了这个错误:'/Users/user/usr/anaconda_2.7/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in getattr(self, name) 2670 if name in self._info_axis: 2671 return self[name] -> 2672 return object.getattribute(self, name) 2673 2674 def setattr(self, name, value):AttributeError: 'Series'对象没有'split'属性。' - zork

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)

1
我在我的MacBookPro6,2上尝试了一个74Mb的csv文件,使用的是Intel Core i5处理器,2.53 GHz,处理器数量:1,核心数:2,每个核心的L2缓存:256 KB,L3缓存:3 MB,内存:4 GB。操作系统为OSX EL Capitan Ver. 10.11.6。与逐行应用函数相比,效果要差得多。它消耗了大约6GB的总内存,从未完成,必须强制停止。美学上,这个解决方案看起来很棒,对我来说最易读。我认为这种退化是由于字典和系列对象需要额外的内存分配所致。 - zork
@zork 很好知道。这些是你需要的实际函数吗?如果是,我们可以很容易地将其向量化。 - piRSquared
更新了一些有用的信息。 - piRSquared

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接