2016-11-20 225 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