2016-11-17 45 views
2

我與具有以下結構的大數據幀列工作:如何創建一個唯一的ID列給定一個有序的數值序列?

在:

df1 = pd.DataFrame({'A': [0,0,0,1,2,0,1,0,1,2,3,4,5,6,7]}) 

日期:

A 
0 0 
1 0 
2 0 
3 1 
4 2 
5 0 
6 1 
7 0 
8 1 
9 2 
10 3 
11 4 
12 5 
13 6 
14 7 

正如你所看到的,A是從0到一個有序序列ñ。這代表我的數據中的一個訂單。例如:

A 
2 0 
3 1 
4 2 
5 0 

讓我們的df1(從索引25)塊,在A列中的0代表開始和2表示序列結束。另一方面,如果沒有連續的號碼(例如0),則表示該序列結束。因此,我的問題是如何有效地生成由設在的A的數值順序的唯一鍵或數字符合新的一列(例如id):

 A        id 
0  0 -> begin and ends   1     

1  0 -> begin and ends   2 

2  0 -> begin     3 
3  1 -> continue    3 
4  2 -> ends     3 

5  0 -> begin     4 
6  1 -> ends     4 

7  0 -> begin     5 
8  1 -> continue    5 
9  2 -> continue    5 
10 3 -> continue    5 
11 4 -> continue    5 
12 5 -> continue    5 
13 6 -> continue    5 
14 7 -> ends     5 

我爲了更清楚加入的圖。

回答

5

我認爲你可以使用:

print ((df1.A.diff() < 1).cumsum() + 1) 
0  1 
1  2 
2  3 
3  3 
4  3 
5  4 
6  4 
7  5 
8  5 
9  5 
10 5 
11 5 
12 5 
13 5 
14 5 
Name: A, dtype: int32 

更爲寬泛的處理NaNdiff

dif = df1.A.diff() 
dif.iloc[0] = df1.loc[0,'A'] 
print ((dif < 1).cumsum()) 
0  1 
1  2 
2  3 
3  3 
4  3 
5  4 
6  4 
7  5 
8  5 
9  5 
10 5 
11 5 
12 5 
13 5 
14 5 
Name: A, dtype: int32 

說明:

首先找到差異的diff

dif = df1.A.diff() 
print (dif) 
0  NaN 
1  0.0 
2  0.0 
3  1.0 
4  1.0 
5 -2.0 
6  1.0 
7 -1.0 
8  1.0 
9  1.0 
10 1.0 
11 1.0 
12 1.0 
13 1.0 
14 1.0 
Name: A, dtype: float64 

然後設置第一個值(NaN)原值:

dif.iloc[0] = df1.loc[0,'A'] 

獲取面膜:

print (dif < 1) 
0  True 
1  True 
2  True 
3  False 
4  False 
5  True 
6  False 
7  True 
8  False 
9  False 
10 False 
11 False 
12 False 
13 False 
14 False 
Name: A, dtype: bool 

最後使用cumsum與布爾面膜:

print ((dif < 1).cumsum()) 
0  1 
1  2 
2  3 
3  3 
4  3 
5  4 
6  4 
7  5 
8  5 
9  5 
10 5 
11 5 
12 5 
13 5 
14 5 
Name: A, dtype: int32 
+0

神聖的狗屎......我正在使用iter(),接下來,如果循環....這是驚人的。你可以提供一個解釋嗎?... –

+1

雅,給我一秒 – jezrael

+0

非常感謝你 –

相關問題