python - 当数据集有“-”和“无”单元格时,Pandas 填充缺失的数据
问题描述
我正在使用一个数据集,该数据集的 sourceusername 列中包含“-”,而该数据框的 sourcehostname 列中包含“None”。台式机的 IP 通常保持不变,但笔记本电脑的 IP 会发生变化。我正在尝试使用我所拥有的信息来填补空白。此数据框包含用户将注销的计算机,新用户将登录并创建代理流量。这是数据框的样子:
df
sourceusername sourcehostname sourceaddress destinationhostname
0 1111 Computer_1 10.11.2.22 khms0.google.com
1 1111 Computer_1 10.11.2.22 photos.wavebid.com
2 1112 Computer_2 10.11.2.23 www.msn.com
3 1113 Computer_3 10.11.2.24 log.pinterest.com
4 1113 Computer_3 10.11.2.24 apx.moatads.com
5 - None 10.11.2.23 pixabay.com
6 - Computer_3 10.11.2.24 rb.adnxs.com
7 1111 None 10.11.2.22 dt.adsafeprotected.com
8 1111 Computer_1 10.11.2.22 ad.doubleclick.net
9 - None 10.11.2.23 s0.2mdn.net
10 1114 Computer_1 10.11.2.22 khms2.google.com
11 - None 10.11.2.22 photos.wavebid.com
12 1113 Computer_3 10.11.2.24 log.pinterest.com
期望的输出:
df
sourceusername sourcehostname sourceaddress destinationhostname
0 1111 Computer_1 10.11.2.22 khms0.google.com
1 1111 Computer_1 10.11.2.22 photos.wavebid.com
2 1112 Computer_2 10.11.2.23 www.msn.com
3 1113 Computer_3 10.11.2.24 log.pinterest.com
4 1113 Computer_3 10.11.2.24 apx.moatads.com
5 1112 Computer_2 10.11.2.23 pixabay.com
6 1113 Computer_3 10.11.2.24 rb.adnxs.com
7 1111 Computer_1 10.11.2.22 dt.adsafeprotected.com
8 1111 Computer_1 10.11.2.22 ad.doubleclick.net
9 1112 Computer_2 10.11.2.23 s0.2mdn.net
10 1114 Computer_1 10.11.2.22 khms2.google.com
11 1114 Computer_1 10.11.2.22 photos.wavebid.com
12 1113 Computer_3 10.11.2.24 log.pinterest.com
如您所见,索引 10 处的用户“1114”是“Computer_1”上的新用户。解决填充缺失数据的最佳方法是什么?
解决方案
以下给出了已发布的所需输出:
附加sourceaddress
到索引,因为行号就像评论中讨论的时间序列
df = df.set_index('sourceaddress', append=True)
交换Index
级别,然后对MultiLevel
索引进行排序,以有效显示按每个 IP 地址分组的事件的“时间”顺序
df = df.swaplevel().sort_index()
现在df
使用 2 级 MultiIndex 如下所示:
sourceusername sourcehostname destinationhostname
sourceaddress
10.11.2.22 0 1111 Computer_1 khms0.google.com
1 1111 Computer_1 photos.wavebid.com
7 1111 None dt.adsafeprotected.com
8 1111 Computer_1 ad.doubleclick.net
10 1114 Computer_1 khms2.google.com
11 - None photos.wavebid.com
10.11.2.23 2 1112 Computer_2 www.msn.com
5 - None pixabay.com
9 - None s0.2mdn.net
10.11.2.24 3 1113 Computer_3 log.pinterest.com
4 1113 Computer_3 apx.moatads.com
6 - Computer_3 rb.adnxs.com
12 1113 Computer_3 log.pinterest.com
将 '-' 和 'None' 替换为np.nan
并使用 nan 值的前向填充来有效填充我们按 IP 地址分组的伪时间序列
df = df.replace('-', np.nan).replace('None', np.nan).ffill()
将sourceaddress
from移动Index
到数据中以获得我们开始使用的格式:
df = df.reset_index(level='sourceaddress').sort_index()
重新排序列
df = df.reindex(columns=['sourceusername', 'sourcehostname', 'sourceaddress', 'destinationhostname'])
结果如下:
sourceusername sourcehostname sourceaddress destinationhostname
0 1111 Computer_1 10.11.2.22 khms0.google.com
1 1111 Computer_1 10.11.2.22 photos.wavebid.com
2 1112 Computer_2 10.11.2.23 www.msn.com
3 1113 Computer_3 10.11.2.24 log.pinterest.com
4 1113 Computer_3 10.11.2.24 apx.moatads.com
5 1112 Computer_2 10.11.2.23 pixabay.com
6 1113 Computer_3 10.11.2.24 rb.adnxs.com
7 1111 Computer_1 10.11.2.22 dt.adsafeprotected.com
8 1111 Computer_1 10.11.2.22 ad.doubleclick.net
9 1112 Computer_2 10.11.2.23 s0.2mdn.net
10 1114 Computer_1 10.11.2.22 khms2.google.com
11 1114 Computer_1 10.11.2.22 photos.wavebid.com
12 1113 Computer_3 10.11.2.24 log.pinterest.com