2017-05-31 86 views
2

我有一個熊貓數據框,需要根據現有列創建列(不難),但我需要的i th值基於i-1 th值該列。示例系列:基於其他條目的大熊貓操作

data = np.array([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1]) 

我想i個元素爲1,如果它是一系列1 S的開始,如:

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 

還有其他的業務,我想是能夠做到,但只是瞭解如何做到這一點而不需要迭代將會非常有幫助。我很抱歉,如果有人問我,我不知道如何搜索它。

回答

2

如果1是一個組的開始,這意味着它是1,而前一個元素不是1.這在熊貓中比在純粹的numpy中要容易一些,因爲「前一個元素不是1」可以是使用移動所有數據的shift進行翻譯(默認情況下爲1)。

In [15]: s = pd.Series([0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1]) 

In [16]: ((s == 1) & (s.shift() != 1)).astype(int) 
Out[16]: 
0  0 
1  0 
2  0 
3  1 
4  0 
5  0 
6  0 
7  1 
8  0 
9  0 
10 0 
11 1 
12 0 
13 0 
dtype: int64 

即使1是第一要素會的工作,因爲自1前沒有元素,我們在變速後得到的NaN和NaN = 1的情況下:

n [18]: s.shift().head() 
Out[18]: 
0 NaN 
1 0.0 
2 0.0 
3 0.0 
4 1.0 
3

np.where

# [0 0 0 1 1 1 0 1 0 0 0 1 1 1] <- data 
# [0 0 0 0 1 1 1 0 1 0 0 0 1 1] <- np.append(0, data[:-1]) 
#^\__shifted data d[:-1]__/ 
# | 
# appended zero 
# [1 1 1 1 0 0 0 1 0 1 1 1 0 0] <- ~np.append(0, data[:-1]) 
# [0 0 0 1 0 0 0 1 0 0 0 1 0 0] <- result 

np.where(data & ~np.append(0, data[:-1]).astype(bool), 1, 0) 

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 

使用陣列乘法

data * (1 - np.append(0, data[:-1])) 

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 

np.diff

(np.diff(np.append(0, data)) == 1).astype(int) 

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]) 
+0

感謝您的回答,但可悲的是我不能接受這兩個。我主要接受他,因爲我可以更容易地將它推廣到其他問題。 – riders994

+0

@ riders994這是選擇帝斯曼回答的理由。沒有必要證明你的選擇合理。我很高興你接受了答案:-) – piRSquared