【发布时间】:2021-03-02 16:52:14
【问题描述】:
我有一个数据帧,其中包含一些与此类似的网络流
flow = {'date': ['2020-11-13 13:57:51','2020-11-13 13:57:51','2020-11-13 13:57:52','2020-11-13 13:59:53','2020-11-13 13:59:54'],
'source_ip': ['192.168.1.1','192.168.1.2','10.0.0.1','192.168.1.1','192.168.1.1'],
'destination_ip': ['10.0.0.1', '10.0.0.1', '192.168.1.1', '192.168.1.2', '192.168.1.2'],
'source_bytes':[5,1,2,3,3]
}
df = pd.DataFrame(flow, columns = ['date', 'source_ip', 'destination_ip', 'source_bytes']).set_index('date')
看起来像这样
date | source_ip | destination_ip| source_bytes
2020-11-13 13:57:51 | 192.168.1.1 | 10.0.0.1 | 5
2020-11-13 13:57:51 | 192.168.1.2 | 10.0.0.1 | 1
2020-11-13 13:57:52 | 10.0.0.1 | 192.168.1.1 | 2
2020-11-13 13:59:53 | 192.168.1.1 | 192.168.1.2 | 3
2020-11-13 13:59:54 | 192.168.1.2 | 192.168.1.1 | 3
我想将它们重新采样为 1 分钟的刻度,但也按 ip 分组。然后source_bytes需要聚合,不管ip是在source_ip还是destination_ip中
应该变成这样。 (手动计算。希望这里没有做任何错误)。每分钟都应该表示所有 ip,但如果没有值则用零填充。
ip | date | source_bytes_sum
192.168.1.1 | 2020-11-13 13:57:00 | 7
192.168.1.2 | 2020-11-13 13:57:00 | 1
10.0.0.1 | 2020-11-13 13:57:00 | 8
192.168.1.1 | 2020-11-13 13:59:00 | 6
192.168.1.2 | 2020-11-13 13:59:00 | 6
10.0.0.1 | 2020-11-13 13:59:00 | 0
这里相同的表示只是按 ip '分组'
ip | date | source_bytes_sum
192.168.1.1 | 2020-11-13 13:57:00 | 7
| 2020-11-13 13:59:00 | 6
192.168.1.2 | 2020-11-13 13:57:00 | 1
| 2020-11-13 13:59:00 | 6
10.0.0.1 | 2020-11-13 13:57:00 | 8
| 2020-11-13 13:59:00 | 0
我开始尝试以下方法,但仅按 source_ip 分组并忽略destination_ip。它也不会添加零值
grouped = df.groupby(['source_ip', pd.Grouper(key='date', freq='1min')])[['source_bytes']].agg(['sum'])
grouped
source_bytes
sum
source_ip date
10.0.0.1 2020-11-13 13:57:00 2
192.168.1.1 2020-11-13 13:57:00 5
2020-11-13 13:59:00 6
192.168.1.2 2020-11-13 13:57:00 1
【问题讨论】:
-
你研究过 pandas 的重采样功能吗? resample link
-
是的,如我的示例所示。但不知道如何将source_ip和destination_ip组合到采样中。
标签: pandas time-series resampling