数据框按小时和最大日期过滤行

时间:2019-04-19 12:58:55

标签: python pandas dataframe

在一个数据帧中,我想按小时/键并等于最大日期来过滤某些“系列”中的所有行。

我有一段有效的代码,但想知道是否没有更紧凑或更优雅的东西可以实现相同的目的?

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

2 个答案:

答案 0 :(得分:3)

解决方案很好,仅需进行简单的简化-布尔掩码应添加到变量import socket client_socket = socket.socket() client_socket.connect(("127.0.0.1", 8000)) #or enter ip of server client_command = input("command: ") client_socket.send(client_command.encode()) data = client_socket.recv(1024).decode() print("server: " + data) 中,对于使用过的m取反,还应使用双DataFrame.reset_index-首先删除第二级,然后删除第二级对于索引中的列:

~

答案 1 :(得分:3)

使用transformisin的IIUC,对于使用row的所有组潮,transform将获得最大值,然后我们使用isin,如果该值不在Keys2Filter中,则我们应该选择,如果它在Keys2Filter中,它将在False下返回~isin,那么我们去检查第二个条件,如果该行产生了group的最大值,那么我们仍然选择它。

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的原始顺序。