python - 数据框按小时和最大日期过滤行
问题描述
在数据框中,我想按小时/键过滤某些“系列”中的所有行,并且等于最大日期。
我有一段工作代码,但想知道是否没有更紧凑或更优雅的东西来实现相同的目标?
df = pd.read_csv("./example.csv")
df["Date"] = pd.to_datetime(df["Date"])
Keys2Filter = (1, 2)
df
...
Key Date Value
0 1 2019-04-17 00:00:00 1
1 1 2019-04-17 01:00:00 2
2 1 2019-04-17 02:00:00 3
3 1 2019-04-17 00:00:00 4
4 1 2019-04-17 01:00:00 5
5 1 2019-04-17 00:00:00 7
6 2 2019-04-17 01:00:00 8
7 2 2019-04-17 02:00:00 9
8 2 2019-04-17 00:00:00 9
9 2 2019-04-17 01:00:00 9
10 3 2019-04-17 01:00:00 9
11 3 2019-04-17 01:00:00 9
...
if (len(Keys2Filter)):
dfMax = df[df.Key.isin(Keys2Filter)]
dfMax = dfMax.groupby(by=["Key", dfMax.Date.dt.hour]).max()
dfMax.index.names = ["Key", "Hour"]
dfMax = dfMax.reset_index()
df = df[~df.Key.isin(Keys2Filter)].append(dfMax.drop(columns=['Hour']))
df
Key Date Value
10 3 2019-04-17 01:00:00 9
11 3 2019-04-17 01:00:00 9
0 1 2019-04-17 00:00:00 7
1 1 2019-04-17 01:00:00 5
2 1 2019-04-17 02:00:00 3
3 2 2019-04-17 00:00:00 9
4 2 2019-04-17 01:00:00 9
5 2 2019-04-17 02:00:00 9
解决方案
IIUC 使用transform
and isin
,transform 将得到所有带行的组潮的最大值,然后我们使用isin
,如果该值不在Keys2Filter
,那么我们应该选择,如果它在 下面Keys2Filter
将返回False
,~isin
那么我们去检查第二个条件,如果那一行产生组的最大值,那么我们仍然选择它。
s=df.groupby([df.Key,df.Date.dt.strftime('%Y-%m-%d %H')])['Value'].transform('idxmax')
Keys2Filter = (1, 2)
df=df.loc[~df.Key.isin(Keys2Filter)|df.index.eq(s)].copy()#avoid the copy error
df
Out[991]:
Key Date Value
2 1 2019-04-17 02:00:00 3
4 1 2019-04-17 01:00:00 5
5 1 2019-04-17 00:00:00 7
7 2 2019-04-17 02:00:00 9
8 2 2019-04-17 00:00:00 9
9 2 2019-04-17 01:00:00 9
10 3 2019-04-17 01:00:00 9
11 3 2019-04-17 01:00:00 9
请注意,使用此方法将保持您的 df 的原始顺序。
推荐阅读
- ios - 如何在 SwiftUI 中使用 DisclosureGroup 作为下拉菜单?
- javascript - Bootstrap 5 & Vanilla JS 在滚动时将第二个导航栏固定在顶部
- java - Java Punycode 字符串
- asp.net-mvc - 外部消息 SignalR (DB ==> WebServer)
- recording - 我应该在 Ant Media Server 中以 HLS 或 mp4 格式录制我的流吗?
- icloud - 有没有办法/api 从 icloud 获取健康数据?
- html - 将跨度值传递给隐藏的输入
- java - 如何制作可变的可绘制数组?
- python - 为什么 TensorFlow Lite 模型在动态范围量化时表现出色,但在全整数量化时表现不佳?
- javascript - getUserMedia 之后的 enumerateDevices:如何找到活动设备?