簡體   English   中英

如何遍歷Pandas數據框並根據先前的行進行更新

[英]how to iterate over Pandas data frame and update based on previous rows

我有一些需要工作的代碼,但是速度很慢。 我需要更新交易表和報價表。 基表是這樣的:

+--------+-----------+----------+----------+--------+----------+
| Symbol | Timestamp | BidPrice | AskPrice | Price  | Quantity |
+--------+-----------+----------+----------+--------+----------+
| MSFT   | 9:00      |          |          | 46.98  |      140 |
| MSFT   | 9:01      |          |          | 46.99  |      100 |
| MSFT   | 9:02      |          |          | 47     |      400 |
| MSFT   | 9:03      |          |          | 47     |      100 |
| MSFT   | 9:04      | 46.87    | 46.99    |        |          |
| MSFT   | 9:05      |          |          | 46.89  |      100 |
| MSFT   | 9:06      |          |          | 46.95  |      600 |
| MSFT   | 9:07      | 46.91    | 46.99    |        |          |
| MSFT   | 9:08      | 46.91    | 46.97    |        |          |
| MSFT   | 9:09      |          |          | 46.935 |      100 |
| MSFT   | 9:10      | 46.89    | 46.96    |        |          |
| MSFT   | 9:11      |          |          | 46.93  |      100 |
| MSFT   | 9:12      |          |          | 46.91  |      100 |
+--------+-----------+----------+----------+--------+----------+

我需要為每個交易設置出價和價格(有價格,但沒有出價/要價)。 因此,以bid = 46.8並要求= 47開始,設置值,然后在這些值更改時設置新值。 像這樣:

+--------+-----------+----------+----------+--------+----------+
| Symbol | Timestamp | BidPrice | AskPrice | Price  | Quantity |
+--------+-----------+----------+----------+--------+----------+
| MSFT   | 9:00      | 46.8     | 47       | 46.98  |      140 |
| MSFT   | 9:01      | 46.8     | 47       | 46.99  |      100 |
| MSFT   | 9:02      | 46.8     | 47       | 47     |      400 |
| MSFT   | 9:03      | 46.8     | 47       | 47     |      100 |
| MSFT   | 9:04      | 46.87    | 46.99    |        |          |
| MSFT   | 9:05      | 46.87    | 46.99    | 46.89  |      100 |
| MSFT   | 9:06      | 46.87    | 46.99    | 46.95  |      600 |
| MSFT   | 9:07      | 46.91    | 46.99    |        |          |
| MSFT   | 9:08      | 46.91    | 46.97    |        |          |
| MSFT   | 9:09      | 46.91    | 46.97    | 46.935 |      100 |
| MSFT   | 9:10      | 46.89    | 46.96    |        |          |
| MSFT   | 9:11      | 46.89    | 46.96    | 46.93  |      100 |
| MSFT   | 9:12      | 46.89    | 46.96    | 46.91  |      100 |
+--------+-----------+----------+----------+--------+----------+

我反復遍歷了行,但是對於112k行,這需要35秒。

for i, row in qts_trd.iterrows():
    if np.isnan(row['Price']):
        bid = row['BidPrice']
        ask = row['AskPrice']        
    if np.isnan(row['BidPrice']):
        qts_trd.at[i,'BidPrice'] = bid
        qts_trd.at[i,'AskPrice'] = ask

我知道lambda函數的基礎,將相同的函數應用於每一行。 我認為它更快,但是正如您所見,它會發生變化。 有沒有更有效/快捷的方法來做到這一點?

這是Spyder中的Python 3.7。

使用method='ffill'嘗試pandas fillna()函數

所以:

qts_trd.BidPrice.fillna(method='ffill', inplace=True)
qts_trd.AskPrice.fillna(method='ffill', inplace=True)

以我的經驗,它很快

編輯:

我只是意識到這不會填充您的第一個值,下面的代碼將在頂部插入一行以進行填充,然后將其刪除。

qts_trd.loc[-1] = ['', '', 46.8, 47, '', '']
qts_trd.index += 1
qts_trd.sort_index(inplace=True)
qts_trd.BidPrice.fillna(method='ffill', inplace=True)
qts_trd.AskPrice.fillna(method='ffill', inplace=True)
qts_trd.drop(0,0,inplace=True)
qts_trd.reset_index(drop=True, inplace=True)

編輯2.0 ...感謝@no_body的評論:

qts_trd.BidPrice.fillna(method='ffill', inplace=True).fillna(46.8)
qts_trd.AskPrice.fillna(method='ffill', inplace=True).fillna(47)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM