在一个数据帧中,我想按小时/键并等于最大日期来过滤某些“系列”中的所有行。
我有一段有效的代码,但想知道是否没有更紧凑或更优雅的东西可以实现相同的目的?
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
答案 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)
使用transform
和isin
的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的原始顺序。