使用 Pandas 计算每列出现的次数

Count the number of occurence per column with Pandas

我想计算每个列中两个不同值的出现次数,第一个是 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: Could not compare ['\N'] with block values

我假设您只想计算字符串以“\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

一个班轮:

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

您可以使用 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.

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

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

输出:

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