【问题标题】:How to plot a two column pandas dataframe's elements as an histogram?如何将两列熊猫数据框元素绘制为直方图?
【发布时间】:2016-12-08 15:15:54
【问题描述】:

我有以下熊猫数据框:

    A                    B

    1                    3
    0                    2
    1                    4
    0                    1
    0                    3

我想绘制给定 A 的 B 实例的频率,如下所示:

     |
     |
     |        __
 B   |       |  |
     |  ___  |  |
     |  | |  |  |
     |  | |  |  |
     |__|_|__|__|______________
                A

因此,我尝试了以下方法:

df2.groupby([df.A, df.B]).count().plot(kind="bar")

但是,我收到以下异常:

TypeError: Empty 'DataFrame': no numeric data to plot

因此,我的问题是如何根据 A 的频率绘制 B 中元素的频率?

【问题讨论】:

  • @john_doe:我看到您将我的答案标记为正确,然后将其删除。你有什么理由这样做?
  • 我仍然对你想要什么感到很困惑......你只是想将 A 绘制为 x 轴,将 B 绘制为 y,不管它们的值如何,还是你想要一些看起来像你的 ASCII 图形?意思是像 B x A ?
  • 感谢你们的帮助,我真的很感谢你们的时间。我期待着采用 Sreejith Menon 的方法。

标签: python python-3.x pandas matplotlib


【解决方案1】:

听起来这就是你想要的: 你可以使用Series.value_counts()

print(df['B'].value_counts().plot(kind='bar'))

如果您不想对 value_count 进行排序,可以这样做:

print(df['B'].value_counts(sort=False).plot(kind='bar'))

【讨论】:

    【解决方案2】:

    我不完全确定“根据 A 的频率绘制 B 中元素的频率”是什么意思,但这给出了预期的输出:

    In [4]: df
    Out[4]: 
          A  B
    3995  1  3
    3996  0  2
    3997  1  4
    3998  0  1
    3999  0  3
    
    In [8]: df['data'] = df['A']*df['B']
    
    In [9]: df
    Out[9]: 
          A  B  data
    3995  1  3     3
    3996  0  2     0
    3997  1  4     4
    3998  0  1     0
    3999  0  3     0
    
    In [10]: df[['A','data']].plot(kind='bar', x='A', y='data')
    Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x7fde7eebb9e8>
    
    In [11]: plt.show()
    

    【讨论】:

    • 感谢您的帮助,我想我把你弄糊涂了,因为 3995 , 3996, 3997, 3998, 3999 只是索引号,我有兴趣只绘制 A 和 B 列,我编辑了问题.
    • @johndoe 仍然,你所期望的和我回答中的截图有什么区别?您只想用 0 和 1 代替 3995..3999 索引吗?
    • 是的,我想将 A 列的值绘制为 x 轴,将 B 列的值绘制为 y 轴。感谢您的帮助
    【解决方案3】:

    这是我的方式:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame([[1,3],[0,2],[1,4],[0,1],[0,3]])
    df.columns = ['A', 'B']
    x = df.loc[:,'A'].values
    y = df.loc[:,'B'].values
    plt.bar(x, y, label = 'Bar', align='center',)
    plt.xticks(x)
    plt.show()
    

    【讨论】:

      【解决方案4】:

      我相信如果您尝试绘制 b 列中值出现的频率,这可能会有所帮助。

      from collections import Counter
      vals = list(df['b'])
      cntr = Counter(vals)
      # Out[30]: Counter({1: 1, 2: 1, 3: 2, 4: 1})
      
      vals = [(key,cntr[key]) for key in cntr]
      x = [tup[0] for tup in vals]
      y = [tup[1] for tup in vals]
      
      plt.bar(x,y,label='Bar1',color='red')
      plt.show()
      

      matplotlib 使用histogram 的另一种方式。 首先声明一个 bins 数组,它基本上是您的值将进入的存储桶。

      import matplotlib.pyplot as plt
      import pandas as pd
      
      l = [(1,3),(0,2),(1,4),(0,1),(0,3)]
      df = pd.DataFrame(l)
      
      df.columns = ['a','b']
      bins = [1,2,3,4,5] #ranges of data
      plt.hist(list(df['b']),bins,histtype='bar',rwidth=0.8)
      

      【讨论】:

      • 感谢您的帮助,这实际上是我所期望的
      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 2020-10-10
      • 2021-10-16
      • 2019-07-21
      • 2018-07-05
      • 2020-03-02
      • 2013-07-22
      相关资源
      最近更新 更多