Python 有效地处理来自Dataframe的选定(query())数据

Python 有效地处理来自Dataframe的选定(query())数据,python,numpy,pandas,indexing,pandasql,Python,Numpy,Pandas,Indexing,Pandasql,在查询数据帧之后,我想在查询中获得所选索引之前的3个条目 下面的代码是有效的,但我认为这是肮脏的,没有效率的,我只能想象有一个更好的方法来处理熊猫 有人能帮我吗 将熊猫作为pd导入 将numpy作为np导入 日期=pd.日期范围('2015年1月1日',期间=50) df=pd.DataFrame(np.random.randn(50,4),index=dates,columns=['A','B','C','D']) x=(df['B']>df['A'])和\ ((df['B'].shift(+

在查询数据帧之后,我想在查询中获得所选索引之前的3个条目

下面的代码是有效的,但我认为这是肮脏的,没有效率的,我只能想象有一个更好的方法来处理熊猫

有人能帮我吗

将熊猫作为pd导入
将numpy作为np导入
日期=pd.日期范围('2015年1月1日',期间=50)
df=pd.DataFrame(np.random.randn(50,4),index=dates,columns=['A','B','C','D'])
x=(df['B']>df['A'])和\
((df['B'].shift(+1)>df['A'].shift(+1))==False)和\
(df['B'].shift(+2)>df['A'].shift(+2))&\
(df['C']
上述代码的示例输出:

                   A         B         C         D
2015-01-02 -0.600371 -1.088227 -1.213046 -0.000058
2015-01-03 -2.373683 -0.455126 -0.852127  0.311744
2015-01-04  0.240301 -1.957885  0.184642  0.690865
                   A         B         C         D
2015-01-05 -0.833244 -0.787022 -1.490983 -0.540114
2015-01-06  0.569680  1.798457  1.253075  0.835848
2015-01-07 -0.245731 -0.365678  1.452985  2.007146

Process finished with exit code 0
我的另一个问题是,如果可以在查询中使用带有“Pandas Language”的“shift”,而不是使用Python

谢谢你的帮助

好吧,这个方法不接受可以应用于列的函数和方法,至少我不能让它工作

您可以使用该方法-它看起来会更好一些:

In [168]: %paste
mask = (df.eval('B > A')
        & df.shift(1).eval('B <= A')
        & df.shift(2).eval('B > A')
        & (df.C < df.C.shift(2))
        & (df.D < df.D.shift(1)))

df.ix[np.concatenate([np.arange(i-2, i+1) for i in mask.reset_index(name='bool').query('bool').index])]
## -- End pasted text --
Out[168]:
                   A         B         C         D
2015-01-03  0.027326  1.896523  1.052508  0.279496
2015-01-04 -0.226720 -1.465787  2.459746  0.089118
2015-01-05  0.323047  1.707117 -1.760567 -0.066462
2015-01-31 -1.059314  1.991725  0.819225 -1.212651
2015-02-01  1.372391  0.247049  0.408600  0.908394
2015-02-02 -0.777752 -0.326590 -0.062228 -0.226803
2015-02-16 -0.192333  0.562463  0.126509 -0.342867
2015-02-17 -0.363513 -1.582659 -0.903556  0.973706
2015-02-18 -0.796225 -0.575127  0.078172 -2.182067
In [162]: mask.reset_index(name='bool').query('bool')
Out[162]:
        index  bool
4  2015-01-05  True
32 2015-02-02  True
48 2015-02-18  True

In [163]: mask.reset_index(name='bool').query('bool').index
Out[163]: Int64Index([4, 32, 48], dtype='int64')

In [164]: [np.arange(i-2, i+1) for i in mask.reset_index(name='bool').query('bool').index]
Out[164]:
[array([2, 3, 4], dtype=int64),
 array([30, 31, 32], dtype=int64),
 array([46, 47, 48], dtype=int64)]

In [165]: np.concatenate([np.arange(i-2, i+1) for i in mask.reset_index(name='bool').query('bool').index])
Out[165]: array([ 2,  3,  4, 30, 31, 32, 46, 47, 48], dtype=int64)