Python:如何为所有变量生成频率计数

时间:2018-07-31 14:11:45

标签: python pandas numpy count

我有一个所有类别变量的数据集,我想一次为所有变量产生频率计数。

据说,我使用的是鸢尾花数据集函数df['class'].value_counts()仅允许我计算一个变量。

要分析数据集的所有变量,仅包含通过Pandas作为csv提取的分类变量。我正在考虑只提取第一行并放入for循环中。为了从csv文件中提取第一行,我们使用data = pd.DataFrame(data)将csv转换为数据帧。但是,data[0]将产生错误。

为所有变量生成频率分析或条形图的最有效方法是什么?

带有分类变量的样本数据集:

   Mary  John   David    Jenny
    a     t       y        n
    a     t       n        y
    a     u       y        y
    a     u       n        y
    a     u       n        n
    b     t       y        n

3 个答案:

答案 0 :(得分:2)

方法1

df.apply(lambda x: x.value_counts()).T.stack()

输出:

Mary   a    5.0
       b    1.0
John   t    3.0
       u    3.0
David  n    3.0
       y    3.0
Jenny  n    3.0
       y    3.0
dtype: float64

方法2

df.apply(pd.value_counts).T.fillna(0)

输出

          a   b   n   t   u   y
Mary    5.0 1.0 0.0 0.0 0.0 0.0
John    0.0 0.0 0.0 3.0 3.0 0.0
David   0.0 0.0 3.0 0.0 0.0 3.0
Jenny   0.0 0.0 3.0 0.0 0.0 3.0

然后,您可以在下面简单地使用o创建条形图。

df.apply(pd.value_counts).T.stack().plot(kind='bar')

输出:

enter image description here

或者,您可以使用:

df.apply(pd.value_counts).fillna(0).T.plot(kind='bar')

输出:

enter image description here

答案 1 :(得分:1)

pd.DataFrame({i:df[i].value_counts() for i in df.columns})

注意:如果存在大量NaN,这将产生运行时错误,但是您可以忽略这些错误。如果您不喜欢NaN,只需使用

{i:df[i].value_counts() for i in df.columns}

答案 2 :(得分:1)

使用

df.stack().str.get_dummies().sum(level=1)
Out[537]: 
       a  b  n  t  u  y
Mary   5  1  0  0  0  0
John   0  0  0  3  3  0
David  0  0  3  0  0  3
Jenny  0  0  3  0  0  3

并绘制如下图所示的条形图

df.stack().str.get_dummies().sum(level=1).plot(kind='bar')

enter image description here