【问题标题】:How to remove certain set of strings from a column output via pandas如何通过熊猫从列输出中删除某些字符串集
【发布时间】:2019-07-18 10:32:38
【问题描述】:

我正在尝试从数据框列中删除某些字符串,只是想知道如何以更好的方式实现这一点,一种方法是使用多个 replace,但我想避免这种情况。

原始数据

ctflex08 | SUCCESS | rc=0 | (stdout) server ntp-tichmond minpoll 4 maxpoll 10\nserver ntp-tichmond-b minpoll 4 maxpoll 10\nserver 127.127.1.0
ctfclx806 | SUCCESS | rc=0 | (stdout) server ntp-mary.example.com
ctfclx802 | SUCCESS | rc=0 | (stdout) server ntp-mary.example.com
ti-goyala | SUCCESS | rc=0 | (stdout) server ntp-tichmond minpoll 4 maxpoll 10\nserver ntp-tichmond-b minpoll 4 maxpoll 10

数据框结构:

import pandas as pd
matchObj = ['(stdout)', 'server', 'minpoll', 'maxpoll' ]

df = pd.read_csv('ntp_server.txt', sep="|" , names=['Linux_Hosts', 'Host_Dist_version'])

df['Host_Dist_version'] =  df['Host_Dist_version'].replace("server", '',regex=True).replace("minpoll", '',regex=True)
print(df)

电流输出:

                      Linux_Hosts                                  Host_Dist_version
ctflex08      SUCCESS        rc=0    (stdout)  ntp-tichmond  4 maxpoll 10\n ntp-ti...
ctfclx806     SUCCESS        rc=0                      (stdout)  ntp-mary.example.com
ctfclx802     SUCCESS        rc=0                      (stdout)  ntp-mary.example.com
ti-goyala     SUCCESS        rc=0    (stdout)  ntp-tichmond  4 maxpoll 10\n ntp-ti...

预期输出:

Linux_Hosts               Host_Dist_version
ctflex08                  ntp-tichmond  ntp-tichmond-b
ctfclx806                 ntp-mary.example.com
ctfclx802                 ntp-mary.example.com
ti-goyala                 ntp-tichmond ntp-tichmond-b

是否有一种有效的方法来选择所需的字符串并删除或屏蔽它们,例如['ntp-mary', 'ntp-tichmond', 'ntp-tichmond-b'] 只需查看这些列表值并仅选择它们并保留其余部分。

虽然替换了一些特殊的字符和字符串,但它无法正常工作..

SUCCESSS 被视为关键字,\n 也不会被删除。

【问题讨论】:

    标签: regex python-3.x pandas


    【解决方案1】:

    查看更新后的代码:

    import pandas as pd
    df = pd.read_csv('ntp_server.txt', sep="|" , names=['Linux_Hosts','Status','RC','Host_Dist_version'])
    pattern = r'(ntp+[^\s]+)'
    df['Host_Dist_version'] = df['Host_Dist_version'].str.findall(pattern).str.join(' ')
    df = df.drop(['Status','RC'], axis =1)
    print(df)
    

    结果输出:

      Linux_Hosts            Host_Dist_version
    0   ctflex08   ntp-tichmond ntp-tichmond-b
    1  ctfclx806          ntp-mary.example.com
    2  ctfclx802          ntp-mary.example.com
    3  ti-goyala   ntp-tichmond ntp-tichmond-b
    

    解释:pattern 是匹配包含单词'ntp' 的子字符串并捕获所有内容直到下一个空格(我认为这是要求)的正则表达式,如果您不想在. 之后捕获任何内容,那么使用(ntp+[^\s.]+) 正则表达式。

    我还创建了 4 列作为分隔符的 DataFrame,'|' 建议文本文件中有 4 列,如果不需要,您可以稍后删除“状态”和“RC”,希望这会有所帮助。

    【讨论】:

    • Thansk Manojk 但我正在寻找预期的输出。
    • 你能详细解释一下,解决方案和预期有什么区别吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2022-11-17
    • 2021-03-16
    相关资源
    最近更新 更多