熊猫在选择前获得索引值n个位置

时间:2020-02-11 14:08:54

标签: python pandas

我有一个带有日期时间索引的数据框。我也有一个特定的日期列表,我有兴趣在数据框中查看这些日期。我想使行“ n”的位置早于我的特定日期列表。假设示例n = 5。这是我的代码:

import pandas as pd     

# generate an example df
output = pd.DataFrame()    
d = pd.date_range(start='1/1/2000', end='1/1/2006', freq='D')
output['Date'] = d
output['Value'] = 1
output = output[output['Date'].dt.dayofweek < 5].reset_index(drop=True)  # remove weekends
output = output.set_index('Date')

# dates of interest
date_list = pd.to_datetime(['09/05/2002', '15/07/2004', '21/03/2005'], format='%d/%m/%Y')

# i can pull out the dates of interest, but I really want the dates '5' positions ahead
selection = output.iloc[output.index.isin(date_list)]
print(selection)

请注意,前面的'5'位置与timedelta(days = 5)不同

我知道这可以通过迭代来解决,例如:

for i, row in output.iterrows():
    for i2 in date_list:
        if i == i2:
            print(i,  output.loc[i2:].iloc[5])

但我希望使用矢量化的衬纸来理想地做到这一点。任何帮助将不胜感激?

非常感谢!

3 个答案:

答案 0 :(得分:4)

您可以使用flatnonzero来获取索引,将5添加到索引中并进行索引:

import numpy as np
output.iloc[np.flatnonzero(output.index[:-5].isin(date_list)) + 5]

             Value
Date             
2002-05-16      1
2004-07-22      1
2005-03-28      1

或者我们也有熊猫的nonzero

output.iloc[output.index[:-5].isin(date_list).nonzero()[0]+5]

Value
Date             
2004-07-08      1
2005-03-14      1

答案 1 :(得分:1)

首先获取您感兴趣的日期的行位置,然后以所需的数量进行补偿。然后使用偏移行位置从您的数据框中选择:

output.iloc[np.flatnonzero(ouput.index.isin(date_list)) + 5]

答案 2 :(得分:1)

如果按日期将其编入索引,则该方法应该起作用:


mask = pd.DataFrame(output.index.tolist,columns = ['a']).isin(date_list)

output[mask]

如果要在前面选择5个位置,请使用

np.argwhere(np.array(mask)==True) +5