Python Pandas选择索引,其中索引大于x。

31

假设我有一个以日期为索引的DataFrame df,其中含有一些值。如何选择日期大于某个值x的行?

我知道我可以将索引转换为列,然后进行选择df[df['date']>x],但比在索引上执行该操作慢吗?


1
最常用的可能是部分字符串索引。但你也可以像这样做:df[df.index > x] - Karl D.
如果您的索引已经是日期时间,则可以使用相同的方法。只需执行 df[df > x] 即可。 - EdChum
4个回答

49

使用索引从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

2
上面的回答更为严谨,但如果您想要快速查询(例如,在使用Jupyter笔记本时),以下内容也是有效的:df[de.index > "2014-01-04"] - idichekop
df.index可以推广到索引的函数吗?例如选择偶数日期? - alancalvitti
如果有人对A列小于某个数字感兴趣,该怎么办? - CromeX

9

现有的答案是正确的,但如果我们基于索引进行选择,则这里的第二种方法会更快:

# 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')]

1
pd.Timestamp中,Timestamp中的s应该是小写。 - shreyansp
谢谢!已转换为小写。 - ntg
这不是正确的答案。这也会返回索引等于 x 的行(例如,'2002-1-1 01:00:00' 将被包括在内),而问题是选择索引大于 x 的行。 - bennylp
@bennylp 很好的观点。为了获得严格更大的值,我们可以使用 +epsilon,例如 pd.Timestamp('2002-1-1 01:00:00.0001')。 - ntg

0

或者您可以使用{{link1: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

0

结合ntg和Datageek的答案来解决各自答案的问题。使用dateutil需要额外导入。 loc方法在技术上是不正确的,因为它无法定义“大于”关系,而不手动递增时间戳可能会在处理纳秒范围内的时间时引起问题。

因此,在我看来,结合两种方法是最好的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接