【问题标题】:Count the number of occurence per column with Pandas用 Pandas 计算每列出现的次数
【发布时间】:2016-06-02 12:25:51
【问题描述】:

我想计算两个不同值的每列出现的次数,第一个是 null 的数量,第二个是我的数据框中 \N 的数量。我的例子:

   A   B   C   D   E   D
1  \N  1   \N  12  1    
2  4       \N  3   0   \N
3      4   M       \N  1

我希望得到以下结果:

A  2
B  1
C  2
D  1
E  1
F  2

我已经用下面的代码成功统计了缺失值的个数:

df = pd.read_csv("mypath/myFile", sep=',')
null_value = df.isnull().sum()

但是下面的代码不起作用:

break_line = df[df == '\N'].count()
return break_line + null_value

我收到以下错误

TypeError: 无法将 ['\N'] 与块值进行比较

【问题讨论】:

    标签: python csv pandas missing-data


    【解决方案1】:

    仅使用矢量化计算的解决方案:

    df.isna().sum() + (df == '\\N').sum()
    

    输出:

    A    2
    B    1
    C    2
    D    1
    E    1
    F    2
    

    【讨论】:

      【解决方案2】:

      一个班轮:

      ns = df.applymap(lambda x: x == '\N').sum(axis = 0)
      
       null_value + ns
      
      A    2
      B    1
      C    2
      D    1
      E    1
      F    2
      

      【讨论】:

      • 你的速度稍快;但是,我认为不需要转置:您可以使用sum()
      • 你说得对,我已经换位了,因为我之前尝试过另一种方式,但没有必要。
      【解决方案3】:

      我假设您只想计算字符串以 '\N' 结尾的值。如果没有,您可以改用str.contains

      我使用字典解析来循环遍历数据框的列,并使用矢量化的str 函数来计算末尾带有\N 的行数。

      df = pd.DataFrame({'A': ['\N', 4, None], 
                         'B': [1, None, 4], 
                         'C': ['\N', '\N', 'M'], 
                         'D': [12, 3, None], 
                         'E': [1, 0, '\N'], 
                         'F': [None, '\N', 1]})
      
      >>> df
            A   B   C   D   E     F
      0    \N   1  \N  12   1  None
      1     4 NaN  \N   3   0    \N
      2  None   4   M NaN  \N     1    
      
      >>> pd.Series({col: df[col].str.endswith('\N').sum() 
                     if df[col].dtype == 'object' else 0 
                     for col in df}) + df.isnull().sum()
      A    2
      B    1
      C    2
      D    1
      E    1
      F    2
      dtype: int64
      

      【讨论】:

      • 该输出与所需的不同。您必须将 NaN 添加到其中。
      【解决方案4】:

      您可以使用applymap 简单地执行以下操作:

      df.applymap(lambda x: x == '\N').sum() + df.isnull().sum()
      

      给你想要的输出:

      A      2
      B      1
      C      2
      D      1
      E      1
      F      2
      dtype: int64
      

      注意:你使用了两次D;我现在将其替换为 F

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 2023-02-08
        • 1970-01-01
        • 2023-02-06
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多