python - 使用多个条件的 Pandas 逻辑索引

标签 python pandas dataframe

我有一个由日期时间戳索引的 pandas 数据框 data_ask_bid,我只想保留日期范围内的行:星期一 @ 00:00 - 星期五 @ 21:59。为此,我编写了以下行:

data_ask_bid = data_ask_bid[((0 <= data_ask_bid.index.weekday <= 3) | (data_ask_bid.index.weekday == 4 & data_ask_bid.index.hour < 22))]

虽然逻辑索引似乎存在问题,但它会抛出错误“具有多个元素的数组的真值不明确”。使用 a.any() 或 a.all()'。我的代码哪里出错了?

最佳答案

我认为你可以使用检查值 numpy.in1d :

mask1 = np.in1d(data_ask_bid.index.weekday, [0,1,2,3])
mask2 = data_ask_bid.index.weekday == 4
mask3 = data_ask_bid.index.hour < 22

mask = mask1 | (mask2 & mask3)

data_ask_bid = data_ask_bid[mask]

示例:

start = pd.to_datetime('2017-02-10 15:00:00')
rng = pd.date_range(start, periods=20, freq='7h')

data_ask_bid = pd.DataFrame({'a': range(20)}, index=rng)  
#print (data_ask_bid)

w = data_ask_bid.index.weekday
mask1 = np.in1d(w, [0,1,2,3])
mask2 = w == 4
mask3 = data_ask_bid.index.hour < 22

mask = mask1 | (mask2 & mask3)
print (mask)
[ True False False False False False False False False  True  True  True
  True  True  True  True  True  True  True  True]

data_ask_bid = data_ask_bid[mask]
print (data_ask_bid)
                      a
2017-02-10 15:00:00   0
2017-02-13 06:00:00   9
2017-02-13 13:00:00  10
2017-02-13 20:00:00  11
2017-02-14 03:00:00  12
2017-02-14 10:00:00  13
2017-02-14 17:00:00  14
2017-02-15 00:00:00  15
2017-02-15 07:00:00  16
2017-02-15 14:00:00  17
2017-02-15 21:00:00  18
2017-02-16 04:00:00  19

时间:

start = pd.to_datetime('2017-02-10 15:00:00')
N = 1000000
rng = pd.date_range(start, periods=N, freq='H')

data_ask_bid = pd.DataFrame({'a': range(N)}, index=rng)  
print (data_ask_bid)

def jez(data_ask_bid):
    w = data_ask_bid.index.weekday
    mask1 = np.in1d(w, [0,1,2,3])
    mask2 = w == 4
    mask3 = data_ask_bid.index.hour < 22
    data_ask_bid = data_ask_bid[mask1 | (mask2 & mask3)]
    return (data_ask_bid)

print (jez(data_ask_bid))

print (data_ask_bid[(((data_ask_bid.index.weekday >= 0) & (data_ask_bid.index.weekday <= 3)) | ((data_ask_bid.index.weekday == 4) & (data_ask_bid.index.hour < 22)))])
In [273]: %timeit (jez(data_ask_bid))
10 loops, best of 3: 142 ms per loop

In [274]: %timeit (data_ask_bid[(((data_ask_bid.index.weekday >= 0) & (data_ask_bid.index.weekday <= 3)) | ((data_ask_bid.index.weekday == 4) & (data_ask_bid.index.hour < 22)))])
1 loop, best of 3: 267 ms per loop

关于python - 使用多个条件的 Pandas 逻辑索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42160287/

相关文章:

r - 如何在 data.tables 中使用 i 根据条件选择所有列的行

Python 在整个列表中查找字符串的公共(public)部分并将其从每个项目中删除

python - 使用 configparser 添加注释

python - 如何在 Python 中实现 Selenium 多个 WebDriverWait 的方法链接

python - 缺少趋势线

python - 我怎样才能只比较数据框的模式?

python - 将多列添加到 pandas 数据框

python - pyspark 状态报告之间的时间

python - 如何使用 Pandas 将用户定义的列名写入 csv 文件?

python - Pandas 如何确定某个东西是否是 "scalar"?