【问题标题】:count distinct values in single column Python Pandas计算单列 Python Pandas 中的不同值
【发布时间】:2018-07-16 23:32:25
【问题描述】:

在使用和研究 pandas 模块时,我遇到了通过 pandas 计算单列中不同值的解决方案,我使用了以下代码

  #!/bin/python3
    import csv
    import pandas as pd
    ## Display Settings
    pd.set_option('display.height', None)
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', None)
    pd.set_option('expand_frame_repr', True)
    ## Code extraction
    data = pd.read_csv('/home/karn/plura/Test/Python_Pnada/Cyber_July.csv', usecols=['Platform ID', 'Safe', 'Target system address', 'Failure reason'])
    hostData = data[data['Platform ID'].str.startswith("CS-Unix-")][data['Safe'].str.contains("^CS-.*DEFAULT-UNIX-ROOT$")] [['Platform ID', 'Safe', 'Target system address','Failure reason']]
    hostData.reset_index(level=0, drop=True)
    safeCount = hostData.Safe.value_counts()
    print(safeCount)

列的不同值的输出数据:

Safe                

CS-PAR-DEFAULT-UNIX-ROOT    2
CS-MOS-DEFAULT-UNIX-ROOT    1

而代码的整个原始数据示例如下:

           Platform ID                   Safe                          Target system address   Failure reason
    1000   CS-Unix-RootAccounts-SSH     CS-PAR-DEFAULT-UNIX-ROOT                  jjudet      First login - Unable to connect to machine. Ch...
    1003   CS-Unix-RootAccounts-SSH     CS-MOS-DEFAULT-UNIX-ROOT                  tts126      First login - Unable to connect to machine. Ch...
    1005   CS-Unix-RootAccounts-SSH     CS-PAR-DEFAULT-UNIX-ROOT                  dccamus      First login - Unable to connect to machine. Ch...

注意:上面的代码都可以正常工作,但是,如果我需要从另一个用空格分隔的列中计算不同的值,例如在 Failure reason 下,我们该如何实现。

在这种情况下如何使以下工作:

safeCount = hostData."Failure reason".value_counts()

【问题讨论】:

    标签: pandas python-3.6


    【解决方案1】:

    引用 pandas DataFrame 列的语法是:

    返回一个系列:

    safeCount = hostData["Failure reason"].value_counts()
    

    返回一个数据框(即多列):

    safeCount = hostData[["Failure reason", "Safe"]]
    

    并将 Series 方法应用于数据帧:

    safeCount = hostData[["Failure reason", "Safe"]].apply(pd.Series.value_counts)
    

    【讨论】:

    • 看起来很棒。但是,如果我们需要得到两列,可以像safeCount = hostData["Failure reason", "Safe"].value_counts()
    • @pygo 只是一个旁注 - 您可能需要考虑使用:data.loc[data['Platform ID'].str.startswith('CS-Unix-') & data['Safe'].str.contains("^CS-.*DEFAULT-UNIX-ROOT$"), ['Platform ID', 'Safe', 'Target system address', 'Failure reason']] 并利用 ANDing 布尔数组而不是创建新的数据框,然后再次对其进行子集...
    • 谢谢@Gerardo Flores。但是对于多个列,它会给出错误AttributeError: 'DataFrame' object has no attribute 'value_counts'
    • @JonClements,是否有任何链接可以为您提供一个很好的例子。
    • @pygo 那是因为 value_counts() 是系列而不是数据框的方法,请参阅我的更新答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多