根据列值在 DataFrame 中查找下一行

find next row in DataFrame based on column values

我有一个带有非唯一排序日期时间索引的 DataFrame,我需要在某些数据列的特定匹配之后找到下一行。

我可以使用 DataFrame.query() 找到正确的行,这为我提供了一个新的 DataFrame,但我不知道如何找到该行在原始 DataFrame 中的位置。这是一个例子:

import pandas as pd
import numpy as np
from datetime import datetime

ts_index = [
        datetime.strptime('2016-06-19 22:50:22.189', '%Y-%m-%d %H:%M:%S.%f'),
        datetime.strptime('2016-06-19 22:50:22.189', '%Y-%m-%d %H:%M:%S.%f'),
        datetime.strptime('2016-06-19 22:50:22.610', '%Y-%m-%d %H:%M:%S.%f')
        ]
bid_price = [ 77.693, 77.692, 77.692 ]
bid_qty = [ 50.0, 100.0, 50.0 ]
ask_price = [ 77.709, 77.709, 77.709 ]
ask_qty = [ 50.0, 50.0, 50.0 ]

df = pd.DataFrame(index=ts_index, data={'BID_PRICE': bid_price,
    'BID_QTY': bid_qty, 'ASK_PRICE': ask_price, 'ASK_QTY': ask_qty})

most_recent_match = df.query('(BID_PRICE == 77.692) and (BID_QTY == 100.0)').tail(1)

print most_recent_match

是否可以使用整行(索引和列)在 DataFrame 中搜索/定位某个位置?

您可以创建一个布尔掩码,然后将其向下移动一行:

mask = ((df['BID_PRICE'] == 77.692) & (df['BID_QTY'] == 100.0)).shift(1)
df.loc[mask]

产量

In [17]: df.loc[mask]
Out[17]: 
                         ASK_PRICE  ASK_QTY  BID_PRICE  BID_QTY
2016-06-19 22:50:22.610     77.709     50.0     77.692     50.0

这个有用吗?只需重置索引,并确定您所在行的索引

df = pd.DataFrame(index=ts_index, data={'BID_PRICE': bid_price,
    'BID_QTY': bid_qty, 'ASK_PRICE': ask_price, 'ASK_QTY': ask_qty})

df.reset_index(inplace = True)
most_recent_match = df.query('(BID_PRICE == 77.692) and (BID_QTY == 100.0)').tail(1)

df.ix[most_recent_match.index[0]]