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

5
我有一个包含全部分类变量的数据集,我想一次性为所有变量生成频率计数。使用鸢尾花数据集函数df['class'].value_counts()只能计算一个变量。为了分析仅由Pandas提取的分类变量组成的数据集中的所有变量,我考虑仅提取第一行并将其放入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

你想要计数是按列还是整个数据框? - Rushabh Mehta
@RushabhMehta 是的,我对每个变量的级别计数很感兴趣。例如:Mary,a:5,b=1。 - lydias
1
明白了,正在翻译中。 - Rushabh Mehta
3个回答

4

方法一

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

方法二

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

然后,您只需要使用以下代码即可创建条形图。
df.apply(pd.value_counts).T.stack().plot(kind='bar')

输出结果:

在此输入图片描述

另外,您也可以使用以下方式:

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

输出:

输入图像描述


这是一个关于IT技术的图片,无法提供更多细节信息。

第二种方法在我的实际数据集上产生了很好的结果,该数据集有超过10万个观测值。您能否还建议一种从频率分析中排除变量的方法? - lydias
1
我建议你可以直接忽略那个变量的所有行,并应用这些方法。 - harvpan

2

使用

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


我在使用str.get_dummies()时收到了一个错误:~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\strings.py in get_dummies(self, sep) 1695 #为制作虚拟变量而提供的方法... 1696 如果self._is_categorical: 1697 result,name = str_get_dummies(data,sep) 1698 return self._wrap_result(result,use_codes=(not self._is_categorical),name=name,expand=True) - lydias
@lydias,我们使用你提供的样本数据进行了第一次测试,看看是否有效。如果在你展示的样本数据中有效,但在真实数据中无效,那么你应该找出数据之间的差异,这意味着你的样本数据无法重现你的问题。 - BENY
我也尝试了其他方法,但这是唯一一个在原始数据集上无法工作的。 - lydias
@lydias,然后使用另一个答案,我不会删除它,因为这是我通常为str类型的图绘制做的方式,也许你应该做df=df.astype(str)吧,问题仍然不是很清楚,至少没有重现你的问题。 - BENY
注意:我尝试了这个解决方案,对我来说很好用。@lydias,也许你的压缩输入数据并不代表你的 100k 行数据。 - harvpan

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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接