python - 使用 Pandas 过滤非结构化数据
问题描述
我有一个从 CSV 导入的数据框,从该文件进行后过滤,我的临时 DF 在下面
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_table("/DATA/testing/ADNS/ADNS_01_40405.txt", sep=" ",
error_bad_lines=False,skiprows=1,header=None,skipinitialspace=True)
df.columns = ["ONE","TWO","THREE","FOUR","FIVE","SIX","SEVE","EIGH","NINE","TEN","ELEV"]
tmp = df.ONE.str.contains("topoff", na=False)
#tmp = df.ONE.str.isdigit()
TOP_IP = df.loc[tmp]
TOP_IP
一二三四五六七八九十级 483 topoff.pgw-s5s8.epgAMD02.node.epc.mnc005.mcc40... 86400 IN A 203.88.1.58 NaN NaN NaN NaN NaN NaN 484 topoff.sgw-s5s8.epgAMD02.node.epc.mnc005.mcc40... 86400 IN A 10.169.19.89 NaN NaN NaN NaN NaN NaN 486 topoff.pgw-s5s8.epgAMD03.node.epc.mnc005.mcc40... 在 203.88.3.11 NaN NaN NaN NaN NaN NaN NaN 487 topoff.sgw-s5s8.epgAMD03.node.epc.mnc005.mcc40... 在 10.169.18.16 南南南南南南南南南 489 topoff.pgw-s5s8.epgAMD06.node.epc.mnc005.mcc40... 在 203.88.1.49 NaN NaN NaN NaN NaN NaN NaN 490 topoff.sgw-s5s8.epgAMD06.node.epc.mnc005.mcc40... 在 203.88.2.190 NaN NaN NaN NaN NaN NaN NaN 492 topoff.pgw-s5s8.epgAMD07.node.epc.mnc005.mcc40... 在 203.88.4.132 NaN NaN NaN NaN NaN NaN NaN 493 topoff.sgw-s5s8.epgAMD07.node.epc.mnc005.mcc40... 在 203.88.2.190 NaN NaN NaN NaN NaN NaN NaN 495 topoff.pgw-s5s8.epgAMRELICLOUD.node.epc.mnc005... 在 112.110.84.25 NaN NaN NaN NaN NaN 第496章 112.110.84.29 NaN NaN NaN NaN NaN NaN NaN 498 topoff.pgw-s5s8.epgBARODACLOUD.node.epc.mnc005... 在 203.88.4.156 南南南南南南南南南 第499章 203.88.16.7 NaN NaN NaN NaN NaN NaN NaN 501 topoff.pgw-s5s8.epgBHUJCLOUD.node.epc.mnc005.m... 在 112.110.84.35 NaN NaN NaN NaN 第502章 112.110.84.39 NaN NaN NaN NaN NaN NaN NaN 503 topoff.pgw-s5s8.epgDL02.node.epc.mnc005.mcc404... 在 203.88.1.37 NaN NaN NaN NaN NaN NaN NaN 505 topoff.pgw-s5s8.epgGODHRACLOUD.node.epc.mnc005... 在 112.110.84.20 南南南南南南 第506章 112.110.84.24 NaN NaN NaN NaN NaN NaN NaN
后过滤器我只需要一个和四个字段,其中存在数据,但前两个记录不在形状中。
需要以下输出。
一二三四五六七八九十级 483 topoff.pgw-s5s8.epgAMD02.node.epc.mnc005.mcc40... 在 203.88.1.58 NaN NaN NaN NaN NaN NaN 484 topoff.sgw-s5s8.epgAMD02.node.epc.mnc005.mcc40... 在 10.169.19.89 NaN NaN NaN NaN NaN NaN 486 topoff.pgw-s5s8.epgAMD03.node.epc.mnc005.mcc40... 在 203.88.3.11 NaN NaN NaN NaN NaN NaN NaN 487 topoff.sgw-s5s8.epgAMD03.node.epc.mnc005.mcc40... 在 10.169.18.16 南南南南南南南南南 489 topoff.pgw-s5s8.epgAMD06.node.epc.mnc005.mcc40... 在 203.88.1.49 NaN NaN NaN NaN NaN NaN NaN 490 topoff.sgw-s5s8.epgAMD06.node.epc.mnc005.mcc40... 在 203.88.2.190 NaN NaN NaN NaN NaN NaN NaN 492 topoff.pgw-s5s8.epgAMD07.node.epc.mnc005.mcc40... 在 203.88.4.132 NaN NaN NaN NaN NaN NaN NaN 493 topoff.sgw-s5s8.epgAMD07.node.epc.mnc005.mcc40... 在 203.88.2.190 NaN NaN NaN NaN NaN NaN NaN 495 topoff.pgw-s5s8.epgAMRELICLOUD.node.epc.mnc005... 在 112.110.84.25 NaN NaN NaN NaN NaN 第496章 112.110.84.29 NaN NaN NaN NaN NaN NaN NaN 498 topoff.pgw-s5s8.epgBARODACLOUD.node.epc.mnc005... 在 203.88.4.156 南南南南南南南南南
我已经尝试过 isdigit 和许多其他功能,但无法这样做。任何帮助都是合适的。
解决方案
想法是DataFrame.shift
仅使用列中由数字TWO
过滤的行Series.str.isdigit
,最后重新分配原始第一列:
orig = df['ONE'].copy()
mask = df['TWO'].astype(str).str.isdigit()
df[mask] = df[mask].shift(-1, axis=1)
df['ONE'] = orig
print (df)
ONE TWO THREE \
483 topoff.pgw-s5s8.epgAMD02.node.epc.mnc005.mcc40... IN A
484 topoff.sgw-s5s8.epgAMD02.node.epc.mnc005.mcc40... IN A
486 topoff.pgw-s5s8.epgAMD03.node.epc.mnc005.mcc40... IN A
487 topoff.sgw-s5s8.epgAMD03.node.epc.mnc005.mcc40... IN A
489 topoff.pgw-s5s8.epgAMD06.node.epc.mnc005.mcc40... IN A
490 topoff.sgw-s5s8.epgAMD06.node.epc.mnc005.mcc40... IN A
492 topoff.pgw-s5s8.epgAMD07.node.epc.mnc005.mcc40... IN A
493 topoff.sgw-s5s8.epgAMD07.node.epc.mnc005.mcc40... IN A
495 topoff.pgw-s5s8.epgAMRELICLOUD.node.epc.mnc005... IN A
496 topoff.sgw-s5s8.epgAMRELICLOUD.node.epc.mnc005... IN A
498 topoff.pgw-s5s8.epgBARODACLOUD.node.epc.mnc005... IN A
499 topoff.sgw-s5s8.epgBARODACLOUD.node.epc.mnc005... IN A
501 topoff.pgw-s5s8.epgBHUJCLOUD.node.epc.mnc005.m... IN A
502 topoff.sgw-s5s8.epgBHUJCLOUD.node.epc.mnc005.m... IN A
503 topoff.pgw-s5s8.epgDL02.node.epc.mnc005.mcc404... IN A
505 topoff.pgw-s5s8.epgGODHRACLOUD.node.epc.mnc005... IN A
506 topoff.sgw-s5s8.epgGODHRACLOUD.node.epc.mnc005... IN A
FOUR FIVE SIX SEVE EIGH NINE TEN ELEV
483 203.88.1.58 NaN NaN NaN NaN NaN NaN NaN
484 10.169.19.89 NaN NaN NaN NaN NaN NaN NaN
486 203.88.3.11 NaN NaN NaN NaN NaN NaN NaN
487 10.169.18.16 NaN NaN NaN NaN NaN NaN NaN
489 203.88.1.49 NaN NaN NaN NaN NaN NaN NaN
490 203.88.2.190 NaN NaN NaN NaN NaN NaN NaN
492 203.88.4.132 NaN NaN NaN NaN NaN NaN NaN
493 203.88.2.190 NaN NaN NaN NaN NaN NaN NaN
495 112.110.84.25 NaN NaN NaN NaN NaN NaN NaN
496 112.110.84.29 NaN NaN NaN NaN NaN NaN NaN
498 203.88.4.156 NaN NaN NaN NaN NaN NaN NaN
499 203.88.16.7 NaN NaN NaN NaN NaN NaN NaN
501 112.110.84.35 NaN NaN NaN NaN NaN NaN NaN
502 112.110.84.39 NaN NaN NaN NaN NaN NaN NaN
503 203.88.1.37 NaN NaN NaN NaN NaN NaN NaN
505 112.110.84.20 NaN NaN NaN NaN NaN NaN NaN
506 112.110.84.24 NaN NaN NaN NaN NaN NaN NaN
推荐阅读
- cordova-plugins - Cordova 应用程序打开保存对话框以保存文件
- apache - 如何解决 localhost 发送无效响应:ERR_SSL_PROTOCOL_ERROR
- javascript - Google Sheet 单元格显示的数字与应用脚本添加的实际内容不同
- rust - 向 Trait 实现者提供类型信息的问题
- qgis - QGIS打印布局偏移图例标签?
- java - 有没有办法将 Class 作为参数传递给 JAXB XMLAdapter 或从另一个类访问 Getter 方法
- reactjs - 如何利用 useEffect 挂钩从 Firebase 实时数据库中获取数据
- datetime - 为什么 JSON 绑定中的时间格式会发生变化?
- python - python请求模块在已经找到的url中查找url
- sql - 使用 SQL SERVER 2014 过滤版本 Varchar 列