繁体   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