2016-11-20 76 views
1

所以我遇到了这个另一个令人讨厌的问题,作为我学习python的第一步的另一个障碍。正/负值分列?

我有结果栏有正面/负面/零值(赢钱,损失,没有承诺)。我想根据符号拆分为赢/输,还有零将填充零,新赢奖列中的负排;零将在新损失列中填充零和正数行。

DATA。

g=pd.DataFrame({'OUTCOME':[100,-100,400,-200,-200,-750,-250,1000,0,100,-100]},index=[1,1,2,2,2,3,3,3,4,4,4]) 

DESIRED OUTPUT。

g['WINNINGS']=[100,0,400,0,0,0,0,1000,0,100,0] 
g['LOSS']=[0,100,0,200,200,750,250,0,0,0,100] 

回答

3

即使世界的一个以上的方式做到这一点,但基本上你想要做的是适用,如果数量小于或等于零,返回0的函数,并且输入的号码并非如此。然后做相反的事情损失。一种方法是:

def winnings(value): 
    return max(value, 0) 

def losses(value): 
    return min(value, 0) 

df["winnings"] = df["outcome"].map(winnings) 
df["loss"] = = df["outcome"].map(losses) 
+0

你可以添加输出?对我来说它返回错误。 – jezrael

+0

干杯@jezrael。不知道我在想什么。我已经纠正了答案。 – Batman

1

您可以使用Series.where

df["winnings"] = df.OUTCOME.where(df.OUTCOME > 0, 0) 
df["loss"] = -1 * df.OUTCOME.where(df.OUTCOME < 0, 0) 
print (df) 
    OUTCOME winnings loss 
1  100  100  0 
1  -100   0 100 
2  400  400  0 
2  -200   0 200 
2  -200   0 200 
3  -750   0 750 
3  -250   0 250 
3  1000  1000  0 
4  0   0  0 
4  100  100  0 
4  -100   0 100 

或更快的解决方案与numpy.where

df["winnings"] = np.where(df.OUTCOME > 0, df.OUTCOME, 0) 
df["loss"] = np.where(df.OUTCOME < 0, - df.OUTCOME, 0) 

时序

In [68]: %timeit (jez1(df2)) 
100 loops, best of 3: 3.75 ms per loop 

In [69]: %timeit (jez(df1)) 
100 loops, best of 3: 5.82 ms per loop 

In [70]: %timeit (bat(df)) 
10 loops, best of 3: 134 ms per loop 

代码时序

df=pd.DataFrame({'OUTCOME':[100,-100,400,-200,-200,-750,-250,1000,0,100,-100]},index=[1,1,2,2,2,3,3,3,4,4,4]) 
print (df) 
##[110000 rows x 1 columns] 
df = pd.concat([df]*10000).reset_index(drop=True) 
df1 = df.copy() 
df2 = df.copy() 

def winnings(value): 
    return max(value, 0) 

def losses(value): 
    return min(value, 0) 

def bat(df): 
    df["winnings"] = df.OUTCOME.apply(winnings) 
    df["loss"] = - df.OUTCOME.apply(losses) 
    return df 

def jez(df): 
    df["winnings"] = df.OUTCOME.where(df.OUTCOME > 0, 0) 
    df["loss"] = -1 * df.OUTCOME.where(df.OUTCOME < 0, 0) 
    return (df) 

def jez1(df): 
    df["winnings"] = np.where(df.OUTCOME > 0, df.OUTCOME, 0) 
    df["loss"] = np.where(df.OUTCOME < 0, - df.OUTCOME, 0) 
    return (df) 

print (bat(df)) 
print (jez(df1)) 
print (jez1(df2)) 
+0

不错。我没有意识到'哪里'的性能如此之高。 – Batman

+0

是的,最好的是避免'应用' – jezrael