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

时间:2016-06-22 16:50:09

标签: python numpy pandas

我有一个带有非唯一排序日期时间索引的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中搜索/定位位置?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这有用吗?只需重置索引,并确定

之后的行的索引
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]]