PythonPandas选择索引大于x的索引

u2nhd7ah  于 2023-01-11  发布在  Python
关注(0)|答案(4)|浏览(149)

假设我有一个DataFrame df,其中日期作为索引,还有一些值,我如何选择日期大于某个值x的行?
我知道我可以将索引转换为列,然后执行选择df[df['date']>x],但这是否比在索引上执行操作慢?

oug3syen

oug3syen1#

使用索引从DataFrame中选择的示例:

from numpy.random import randn
from pandas import DataFrame
from datetime import timedelta as td
import dateutil.parser

d = dateutil.parser.parse("2014-01-01")
df = DataFrame(randn(6,2), columns=list('AB'), index=[d + td(days=x) for x in range(1,7)])

In [1]: df
Out[1]:
                   A         B
2014-01-02 -1.172285  1.706200
2014-01-03  0.039511 -0.320798
2014-01-04 -0.192179 -0.539397
2014-01-05 -0.475917 -0.280055
2014-01-06  0.163376  1.124602
2014-01-07 -2.477812  0.656750

In [2]: df[df.index > dateutil.parser.parse("2014-01-04")]
Out[2]:
                   A         B
2014-01-05 -0.475917 -0.280055
2014-01-06  0.163376  1.124602
2014-01-07 -2.477812  0.656750
hfyxw5xn

hfyxw5xn2#

现有答案是正确的,但是如果我们基于索引进行选择,the second method from here会更快:

# Set index
df = df.set_index(df['date'])

# Select observations between two datetimes
df.loc[pd.Timestamp('2002-1-1 01:00:00'):pd.Timestamp('2002-1-1 04:00:00')]
jm81lzqq

jm81lzqq3#

或者,您可以使用query

In [14]: df = pd.DataFrame(
    ...:     {'alpha': list('ABCDE'), 'num': range(5)},
    ...:     index=pd.date_range('2022-06-30', '2022-07-04'),
    ...: )

In [15]: df
Out[15]: 
           alpha  num
2022-06-30     A    0
2022-07-01     B    1
2022-07-02     C    2
2022-07-03     D    3
2022-07-04     E    4

In [16]: df.query('index >= "2022-07-02"')
Out[16]: 
           alpha  num
2022-07-02     C    2
2022-07-03     D    3
2022-07-04     E    4
u7up0aaq

u7up0aaq4#

将ntg和Datageek的答案结合起来,以解决每个答案的问题。使用dateutil需要额外的导入。loc方法在技术上是不正确的,因为如果不手动增加时间戳,它就无法定义“大于”关系,这在处理纳秒范围内的时间时可能会令人担忧。
因此,将这两种方法结合起来是最佳解决方案IMO:

In [5]: df = pd.DataFrame(
   ...:     ...:     {'alpha': list('ABCDE'), 'num': range(5)},
   ...:     ...:     index=pd.date_range('2022-06-30', '2022-07-04'),
   ...:     ...: )

In [6]: df
Out[6]: 
           alpha  num
2022-06-30     A    0
2022-07-01     B    1
2022-07-02     C    2
2022-07-03     D    3
2022-07-04     E    4

In [7]: df[df.index > pd.Timestamp('2022-06-30')]
Out[7]: 
           alpha  num
2022-07-01     B    1
2022-07-02     C    2
2022-07-03     D    3
2022-07-04     E    4

相关问题