Python中Groupby后如何按条件过滤数据

How to filter data by conditions after Groupby in Python

我有这样的数据:

price Date Time
100 2021/01/01 9:00
200 2021/01/02 9:00
112 2021/01/01 9:01
223 2021/01/02 9:02
1145 2021/01/01 9:02
2214 2021/01/02 9:03
11 2021/01/01 9:03
20 2021/01/02 9:10

我需要每天获取 3 个值。 9:00 的价格,18:00 的价格(还有更多数据),以及当天的随机值,9:00 和 18:00 除外。 9:00不是开始时间,18:00不是结束时间。

我知道我应该使用 groupby 例如:df.groupby('Date')['price'] 但是我不知道如何在 groupby 之后使用条件来过滤数据。

因为我每天都需要用到这些数据,所以我过滤了这些数据之后,还需要得到这些数据。预期的答案是 [100,112,200](100 是 9:00 的价格,112 是随机价格,200 是 18:00 的价格)

我向您的数据框添加了一些数据:

import pandas
from io import StringIO

csv = StringIO("""price,date,time
100,2021/01/01,9:00
200,2021/01/02,9:00
1800,2021/01/01,18:00
2800,2021/01/02,18:00
112,2021/01/01,9:01
223,2021/01/02,9:02
1145,2021/01/01,9:02
2214,2021/01/02,9:03
11,2021/01/01,9:03
20,2021/01/02,9:10
1145,2021/01/01,19:02
2214,2021/01/02,11:03
11,2021/01/01,19:03
20,2021/01/02,3:10""")

df = pandas.read_csv(csv, index_col=None)

我知道下一部分很乱,我讨厌pandas 但我希望你找到答案并明白了。 只有 运行 个代码 :)

grouped = df.groupby('date')
except18_9 = grouped.apply(lambda x: x[(x['time'] != '18:00')&(x['time'] != '9:00')]).reset_index(drop=True)
part1 = except18_9.groupby('date').sample(n=1)
part2 = grouped.apply(lambda x: x.loc[(x['time'] == '18:00') | (x['time'] == '9:00')]).reset_index(drop=True)
pandas.concat([part1,part2]).sort_values(['date','time'])

最终结果是这样的: