2017-03-12 36 views
1

給定以下大熊貓數據幀(它的副本可以通過發現here。如何在一個單獨的列中填入na,遞增/遞減nr行直到下一個信號值和前向/後向信號值? 信號值僅爲:1; -1或np.na通過遞增/遞減最後找到的值向前/向後填充na?

+----+---------+--------+ 
| | Values | Signal | 
+----+---------+--------+ 
| 0 | 1420.49 |  | 
| 1 | 1421.12 |  | 
| 2 | 1418.95 |  | 
| 3 | 1419.04 |  1 | 
| 4 | 1419.04 |  | 
| 5 | 1417.51 |  | 
| 6 | 1416.97 |  | 
| 7 | 1413.21 |  -1 | 
| 8 | 1411.49 |  | 
| 9 | 1412.57 |  | 
| 10 | 1408.55 |  1 | 
| 11 | 1409.16 |  | 
| 12 | 1413.38 |  | 
| 13 | 1413.38 |  1 | 
| 14 | 1402.35 |  | 
| 15 | 1397.8 |  | 
| 16 | 1398.36 |  | 
| 17 | 1397.62 |  | 
| 18 | 1394.58 |  -1 | 
| 19 | 1399.05 |  | 
| 20 | 1399.9 |  | 
| 21 | 1398.96 |  -1 | 
| 22 | 1398.96 |  | 
| 23 | 1393.69 |  | 
| 24 | 1398.13 |  | 
| 25 | 1398.66 |  | 
| 26 | 1398.02 |  1 | 
| 27 | 1397.97 |  | 
| 28 | 1396.05 |  | 
| 29 | 1398.13 |  | 
+----+---------+--------+ 

結果應該是這樣到底(here是它的一個副本):

+----+---------+--------+------------------------+----------------------+-----------------+ 
| | Values | Signal | forward signal rows nr | backward signal rows | value at signal | 
+----+---------+--------+------------------------+----------------------+-----------------+ 
| 0 | 1420.49 |  |      |      |     | 
| 1 | 1421.12 |  |      |      |     | 
| 2 | 1418.95 |  |      |      |     | 
| 3 | 1419.04 |  1 |      1 |     4 |   1416.97 | 
| 4 | 1419.04 |  |      2 |     3 |   1416.97 | 
| 5 | 1417.51 |  |      3 |     2 |   1416.97 | 
| 6 | 1416.97 |  |      4 |     1 |   1416.97 | 
| 7 | 1413.21 |  -1 |      -1 |     -3 |   1412.57 | 
| 8 | 1411.49 |  |      -2 |     -2 |   1412.57 | 
| 9 | 1412.57 |  |      -3 |     -1 |   1412.57 | 
| 10 | 1408.55 |  1 |      1 |     3 |   1413.38 | 
| 11 | 1409.16 |  |      2 |     2 |   1413.38 | 
| 12 | 1413.38 |  |      3 |     1 |   1413.38 | 
| 13 | 1413.38 |  1 |      1 |     5 |   1397.62 | 
| 14 | 1402.35 |  |      2 |     4 |   1397.62 | 
| 15 | 1397.8 |  |      3 |     3 |   1397.62 | 
| 16 | 1398.36 |  |      4 |     2 |   1397.62 | 
| 17 | 1397.62 |  |      5 |     1 |   1397.62 | 
| 18 | 1394.58 |  -1 |      -1 |     -3 |   1399.9 | 
| 19 | 1399.05 |  |      -2 |     -2 |   1399.9 | 
| 20 | 1399.9 |  |      -3 |     -1 |   1399.9 | 
| 21 | 1398.96 |  -1 |      -1 |     -5 |   1398.66 | 
| 22 | 1398.96 |  |      -2 |     -4 |   1398.66 | 
| 23 | 1393.69 |  |      -3 |     -3 |   1398.66 | 
| 24 | 1398.13 |  |      -4 |     -2 |   1398.66 | 
| 25 | 1398.66 |  |      -5 |     -1 |   1398.66 | 
| 26 | 1398.02 |  1 |      1 |     4 |   1398.13 | 
| 27 | 1397.97 |  |      2 |     3 |   1398.13 | 
| 28 | 1396.05 |  |      3 |     2 |   1398.13 | 
| 29 | 1398.13 |  |      4 |     1 |   1398.13 | 
+----+---------+--------+------------------------+----------------------+-----------------+ 

我有幾個嵌套循環取得了最後的結果,但問題在於它們在幾百萬行的較大數據幀上效率非常低。

+0

..你剛剛刪除了一列,並改變了後向信號行的定義嗎? – DSM

+0

是的,我很抱歉,意識到這是我要求的錯誤結果。但如果你已經有了解決方案,你可以發佈它 – RaduS

回答

3

通常的方法基於信號集團(我們確實應該有,恕我直言,更好的原生支持)使用比較-cumsum-GROUPBY模式。這裏的比較是爲了確定一個信號項是否爲空,在此之後我們做一個累計和,以便每個信號組都有它自己的id(組ID或gid)。其餘的只是算術。

儘管這裏有一些重複,我們可以重構了,我懶洋洋的感覺,所以:

gid = df["Signal"].notnull().cumsum() 
dg = df.groupby(gid) 
sign = dg["Signal"].transform("first") 
df["forward signal rows"] = (dg.cumcount() + 1) * sign 
df["backward signal rows"] = (dg["Signal"].transform("size") - dg.cumcount()) * sign 
df["value at signal"] = dg["Values"].transform("last") 
df.loc[gid == 0, "value at signal"] = np.nan 

給我匹配你的目標一個框架。

+0

謝謝@DSM :)這是一個非常好的方法:) – RaduS