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'])
最终结果是这样的:
我有这样的数据:
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'])
最终结果是这样的: