在pandas数据帧中返回(n)特定索引之前和之后的行数的有效方法

时间:2018-04-11 05:31:17

标签: python pandas sorting

我正在尝试开发一种更有效的方法来返回某些预定索引行之前和之后的值。我目前正在手动执行此操作。

重要索引标记如下([500, 2000, 2500, 4200, 7567])。这些只是一些例子。它们可以是任何索引号。我希望自动化代码,以便每个索引值返回250 rows加上和减去这个数字。由于第一个预期的索引号是500,我想在500的任一侧返回250行。所以250:500500:750。在为每个预期索引执行此操作后,我concatenate将它们放在一起。下面的示例显示了前两个预期索引的过程。

目前,我通过.iloc手动返回相应的行。如果我没有很多想要返回的索引,这很好。但是如果有100个索引需要执行此功能,那就变得非常麻烦。

df = pd.DataFrame(np.random.randn(10000, 4), columns=list('ABCD'))

important_indexes = [500, 2000, 2500, 4200, 7567]

df1 = df.iloc[250:500]
df2 = df.iloc[500:750]
df3 = pd.concat([df1, df2])

df4 = df.iloc[1750:2000]
df5 = df.iloc[2000:2250]
df6 = pd.concat([df4, df5])

df7 = pd.concat([df3,df6])

1 个答案:

答案 0 :(得分:0)

您可以在列表理解中创建索引:

idx = [500, 2000, 2500, 4200, 7567]
N = 3
fin = [i for x in idx for i in range(x-N, x + N + 1) if i in range(len(df))]
print (fin)
[497, 498, 499, 500, 501, 502, 503, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 
 2497, 2498, 2499, 2500, 2501, 2502, 2503, 4197, 4198, 4199, 4200, 4201, 4202, 
 4203, 7564, 7565, 7566, 7567, 7568, 7569, 7570]

df = df.loc[np.unique(fin)]
print (df.head(10))
             A         B         C         D
497  -0.427715 -0.594448 -0.601282  0.470405
498  -1.822557  0.174358  1.278744  0.600856
499   0.288681 -0.843391  1.085665 -0.688055
500   0.105091  1.205726 -1.983058  0.167988
501   0.672003 -1.203700  0.499095  1.158318
502   0.536697 -0.383856  0.873004 -1.290925
503   1.554669 -0.782812  0.900755 -0.328286
1997 -0.187344 -1.100535 -1.791559 -0.588603
1998 -1.525571 -0.316076  1.276415 -0.297315
1999  0.498313 -0.094936 -0.598474  0.045281