2017-07-29 66 views
0

我有熊貓數據幀列「B」,可以是正的或負的值:大熊貓算負值的順序列

data=[[5889.25, 738.0], 
[5896.5, 49.0], 
[5897.5, 130.0], 
[5899.5, -266.0], 
[5903.75, -126.0], 
[5903.75, -512.0], 
[5898.75, -141.0], 
[5897.5, -303.0], 
[5895.0, -107.0], 
[5893.25, 27.0]] 

pd.DataFrame(data,columns=['A','B']) 

    A B 
0 5889.25 738.0 
1 5896.50 49.0 
2 5897.50 130.0 
3 5899.50 -266.0 
4 5903.75 -126.0 
5 5903.75 -512.0 
6 5898.75 -141.0 
7 5897.50 -303.0 
8 5895.00 -107.0 
9 5893.25 27.0 

是什麼力量讓列「C」計數多少快Python的方式行是「B」號的負數?所以,數據幀將如下所示:

A B C 
0 5889.25 738.0 0 
1 5896.50 49.0 0 
2 5897.50 130.0 0 
3 5899.50 -266.0 1 
4 5903.75 -126.0 2 
5 5903.75 -512.0 3 
6 5898.75 -141.0 4 
7 5897.50 -303.0 5 
8 5895.00 -107.0 6 
9 5893.25 27.0 0 

回答

4

您可以使用np.where找到負值然後用groupbycumcount()+1

data=[[5889.25, 738.0], 
[5896.5, 49.0], 
[5897.5, 130.0], 
[5899.5, -266.0], 
[5903.75, -126.0], 
[5903.75, -512.0], 
[5898.75, -141.0], 
[5897.5, -303.0], 
[5895.0, -107.0], 
[5893.25, 27.0]] 

df = pd.DataFrame(data,columns=['A','B']) 
df['C'] = np.where(df['B']>0,0,df.groupby(np.where(df['B']<0,0,df['B'])).cumcount()+1) 

輸出:

 
     A  B C 
0 5889.25 738.0 0 
1 5896.50 49.0 0 
2 5897.50 130.0 0 
3 5899.50 -266.0 1 
4 5903.75 -126.0 2 
5 5903.75 -512.0 3 
6 5898.75 -141.0 4 
7 5897.50 -303.0 5 
8 5895.00 -107.0 6 
9 5893.25 27.0 0 

如果你想創建一個順序爲每個正數可以編寫一個函數

count = 0 
def count_neg(x): 
    global count 
    if x < 0: 
     count+=1 
    else : 
     count = 0 
    return count 
df['C'] = df['B'].apply(count_neg) 

輸出:

 
     A  B C 
0 5889.25 -738.0 1 
1 5896.50 -49.0 2 
2 5897.50 130.0 0 
3 5899.50 -266.0 1 
4 5903.75 -126.0 2 
5 5903.75 -512.0 3 
6 5898.75 -141.0 4 
7 5897.50 -303.0 5 
8 5895.00 -107.0 6 
9 5893.25 27.0 0 
+0

您的解決方案繼續計數所有的負數在一個序列(因此,在下一序列負數7等開始)。如何在每個正數之後重置計數器? – PeterL

+0

@PeterL您是否找到了解決方案來重置每個正值的計數器? – cJc

+0

@cJc我確實提出了重置計數器的解決方案。它是在手動定義的函數幫助下完成的。如果你有任何內置的func來做到這一點,那就太棒了 – Dark