pof*_*pof 6 python dataframe pandas
在一个数据帧中,我想按小时/键并等于最大日期来筛选“系列”中的所有行。
我有一段有效的代码,但想知道是否没有更紧凑或更优雅的方法可以实现相同目的?
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
Run Code Online (Sandbox Code Playgroud)
解决方案很好,只有小的简化 - 布尔掩码应该被缓存到变量m并用于反转~,也DataFrame.reset_index使用双 - 首先用于删除第二级,第二个用于从索引中删除列:
m = df.Key.isin(Keys2Filter)
df = (df[~m].append(df[m].groupby(by=["Key", df.Date.dt.hour])
.max()
.reset_index(level=1, drop=True)
.reset_index()))
print (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
Run Code Online (Sandbox Code Playgroud)