2015-04-01 196 views
0

我有一组列,在其上欲如下来执行有条件的操作的数据帧:熊猫:添加有条件

foo = 0 * foobar2['var1'] 
foo.loc[foobar2['var1'] > 0] += foobar2.loc[foobar2['var1'] > 0, 'var1'] 
foo.loc[foobar2['var2'] > 0] += foobar2.loc[foobar2['var2'] > 0, 'var2'] 
foo.loc[foobar2['var3'] > 0] -= foobar2.loc[foobar2['var3'] > 0, 'var3'] 
foo.loc[foobar2['var4'] > 0] -= foobar2.loc[foobar2['var4'] > 0, 'var4'] 

即,我要总结var1var2,和减法var3,var4 - 无论何时这些变量为正数,因为负变量表示我的数据集中缺失值和类似数据。此代码有效,但速度很慢。有没有更有效的方法来做到这一点?

+0

您是否尝试过使用case语句? – 2015-04-01 13:53:22

+2

Python没有这样的说法。 – TheBlackCat 2015-04-01 14:00:46

回答

1

这种方法我都试过最快:

foo = foobar2.clip_lower(0) 
foo = foo['var1']+foo['var2']-foo['var3']-foo['var4'] 

这种方法是一点点慢一点:

foo = foobar2.clip_lower(0) 
foo['var3']*=-1 
foo['var4']*=-1 
foo = foo.sum(axis=1) 

您还可以使用apply方法一衬垫,其比您的方法更简单,更清晰,但速度也更慢:

foo = foobar2.clip_lower(0).apply(lambda x: x['var1']+x['var2']-x['var3']-x['var4'], axis=1) 
+0

好主意。有时候复制比选择更快。 – FooBar 2015-04-01 14:20:33