【问题标题】:Remove categories having count as 0 in pandas groupby删除 pandas groupby 中计数为 0 的类别
【发布时间】:2018-12-08 20:15:32
【问题描述】:

我想在 pandas value_counts function() 之后删除计数为 0 的类别

我的数据如下:

categories: 
Index(['Average', 'Good',  'Poor', ,'VeryGood', 'VeryPoor'],
  dtype='object')

 Output of value counts:

  score     Frequency
   VG        21
   G         15
   A         63
   P         27
   VP        0

我的结果应该是

  score     Frequency
   VG        21
   G         15
   A         63
   P         27

我想将其存储在数据框中并绘制条形图。我不想在图表中显示 VP,因为它的计数为 0,因此消除了该类别

我的代码:

          quality_scores=quality.SCORE.value_counts()
          quality_scores=pd.Series.to_frame(quality_scores)
          quality_scores=quality_scores.rename(columns={'SCORE': 
            'Frequency'})
          quality_scores['Score']=quality_scores.index
          quality_scores=quality_scores.reset_index(drop=True)


          quality_scores = quality_scores[quality_scores.Frequency != 0]
          quality_scores

我正在根据 cmets 编辑答案:

当我打印数据框时,我得到了正确的答案。但是,当我使用 quality_scores['Score'].cat.categories 检查类别时,我仍然看到不应该显示的 VP 类别。

另外,在图表中,我不希望看到 VP 类别,而是显示在轴上。

以下是图表代码:

           plt.figure(figsize=(15,7))

           quality_graph=sns.barplot(y=quality_scores["Frequency"],
           x=quality_scores["Score"])

           quality_graph.set_xlabel('Frequency')

           quality_graph.set_title('Score Distribution of Quality 
           Measure:',fontsize=25)

           plt.savefig('graphs\\Quality_Measure.png')

如果您可以看到图表上有许多空白类别。这实际上并不存在于 quality_scores 数据框中。

【问题讨论】:

  • 你现在做的事情有什么问题,即quality_scores = quality_scores[quality_scores.Frequency != 0]
  • 我没听明白。
  • 在您的问题中,您说要过滤掉频率 == 0。这不是您已经在做的吗?
  • 是的,但它不起作用。当我绘制 grapg 时,它仍然显示计数为 0 的 VP
  • 您能否在您的问题中添加 1) 示例代码和 2) 您得到的结果出乎意料?运行代码中倒数第二行“quality_scores = quality_scores[quality_scores.Frequency != 0]”后,quality_scores 的值是多少?

标签: python pandas dataframe


【解决方案1】:

记住大小写很重要:“SCORE”和“Score”不一样。您创建了两列,一列称为“SCORE”,另一列称为“Score”。

我运行了以下代码,它按预期工作。

import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
grades = ['VG','G','A','P','VP']
counts = [21,15,63,27,0] 

d = { 'Score' : grades, 'Frequency': counts }
quality_scores = pd.DataFrame(data = d)
quality_scores=quality_scores.reset_index(drop=True)
quality_scores = quality_scores[quality_scores.Frequency != 0]

plt.figure(figsize=(15,7))
quality_graph=sns.barplot(y=quality_scores['Frequency'], x=quality_scores['Score'])
quality_graph.set_xlabel('Frequency')
quality_graph.set_title('Score Distribution of Quality Measure:',fontsize=25)
plt.savefig('Quality_Measure.png')

【讨论】:

    【解决方案2】:

    这是因为VP 仍然是该系列的一个属性。从 pandas 0.23 开始,您可以将 observed=True 传递到您的 groupby 以从数据中删除未观察到的类别:

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 2020-06-20
      • 2016-10-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2021-12-09
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多