熊猫切片排除结束

zca*_*dqe 7 python indexing pandas

使用loc切割数据帧时,

df.loc [开始:结束]

包括开始和结束.使用loc时是否有一种简单的方法可以排除结尾?

Psi*_*dom 9

loc包括开始和结束,一个不太理想的工作是获取索引位置并用于iloc切片数据框(假设您没有重复索引):

df=pd.DataFrame({'A':[1,2,3,4]}, index = ['a','b','c','d'])

df.iloc[df.index.get_loc('a'):df.index.get_loc('c')]

#   A
#a  1
#b  2

df.loc['a':'c']

#   A
#a  1
#b  2
#c  3
Run Code Online (Sandbox Code Playgroud)


Wil*_*llZ 5

我最容易想到的是df.loc[start:end].iloc[:-1]

砍掉最后一个。

  • 假设“end”确实是索引的一部分,则此方法有效。对于日期时间,它可能会适得其反。 (11认同)

Gio*_*eri 5

没有一个答案解决end不属于索引的情况。更通用的解决方案是简单地将索引与start和进行比较end,这样您就可以强制它们中的任何一个包含独占。

df[(df.index >= start) & (df.index < end)]
Run Code Online (Sandbox Code Playgroud)

例如:

>>> import pandas as pd
>>> import numpy as np

>>> df = pd.DataFrame(
    {
        "x": np.arange(48),
        "y": np.arange(48) * 2,
    },
    index=pd.date_range("2020-01-01 00:00:00", freq="1H", periods=48)
)

>>> start = "2020-01-01 14:00"
>>> end = "2020-01-01 19:30" # this is not in the index

>>> df[(df.index >= start) & (df.index < end)]

                    x   y
2020-01-01 14:00:00 14  28
2020-01-01 15:00:00 15  30
2020-01-01 16:00:00 16  32
2020-01-01 17:00:00 17  34
2020-01-01 18:00:00 18  36
2020-01-01 19:00:00 19  38
Run Code Online (Sandbox Code Playgroud)

  • 请谨慎使用此解决方案。即使它是正确的,但需要更长的时间。在我的例子中,每次调用索引的时间不是 1 秒,而是 20 秒。 (4认同)