【问题标题】:How to plot histogram of string and float value of a csv file using Pandas如何使用 Pandas 绘制 csv 文件的字符串直方图和浮点值
【发布时间】:2018-11-06 22:11:04
【问题描述】:

我需要显示 csv 文件的特定属性的直方图。当我绘制数值时我没有问题,但是当我使用字符串值时程序崩溃。 现在我正在使用 iris 数据集进行测试,当我选择“物种”列时程序崩溃。错误是:

Traceback (most recent call last):
File "C:\Users\Enrico\PycharmProjects\PythonDataset\Plot_hist.py", line 31, 
  in <lambda> self.pushButton.clicked.connect(lambda: 
  self.plotHistogram(fileName))
File "C:\Users\Enrico\PycharmProjects\PythonDataset\Plot_hist.py", line 50, 
  in plotHistogram data_file[attribute].plot(kind='hist')
File "C:\Python36\lib\site-packages\pandas\plotting\_core.py", line 2741, in 
  __call__ **kwds)
File "C:\Python36\lib\site-packages\pandas\plotting\_core.py", line 2002, in 
  plot_series **kwds)
File "C:\Python36\lib\site-packages\pandas\plotting\_core.py", line 1804, in 
  _plot plot_obj.generate()
File "C:\Python36\lib\site-packages\pandas\plotting\_core.py", line 258, in 
  generate self._compute_plot_data()
File "C:\Python36\lib\site-packages\pandas\plotting\_core.py", line 373, in 
  _compute_plot_data 'plot'.format(numeric_data.__class__.__name__))
TypeError: Empty 'DataFrame': no numeric data to plot

我的代码是这样的:

import matplotlib.pyplot as plt
import pandas as pd

def plotHistogram(self, file):
    attribute = str(self.comboBox.currentText())
    data_file = pd.read_csv(file)
    data_file[attribute].plot(kind='hist')
    plt.ylabel('Frequency')
    plt.xlabel(attribute)
    plt.title("File")
    plt.show()

attribute是列名,file是csv文件。

注意: 如果我将data_file[attribute].plot(kind='hist') 更改为data_file[attribute].hist() 该程序没有崩溃,但经过很长时间它会绘制一个奇怪的直方图。

编辑: 我必须显示具有 20 到 30 个属性和一千多行的 csv 文件的实验室分析值的直方图。 我需要显示单独取的每个属性的值的直方图,但是值可以是数字数据或字符串。 在 x 轴上,我必须有从最小值到最大值的值的刻度,在 y 轴上的频率,如本例所示:enter link description here

【问题讨论】:

    标签: python python-3.x pandas matplotlib


    【解决方案1】:

    您不能绘制字符串的直方图。您可能正在寻找的是一个条形图,其中条形的高度代表各个字符串的出现频率。这可以通过value_counts() 完成。

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({"num" : np.random.randint(20, size=250),
                      "str" : np.random.choice(["cat", "dog", "pig"], 
                                               size=250, p=[.2,.3,.5])})
    
    df["str"].value_counts().plot.bar()
    
    plt.show()
    

    如果你想让这个看起来更像一个数字直方图,你可以将宽度设置为 1

    df["str"].value_counts().plot.bar(width=1)
    

    【讨论】:

    • 但是我可以在 pd.DataFrame 中插入 csv 文件,像这样 "df = pd.DataFrame(data_file)" ?
    • pd.DataFrame(df) 提供与df 相同的数据框,但不确定它的用途。如果要复制 DataFrame,可以通过 df2 = df.copy() 进行。
    • 没有为字符串定义直方图,所以如果上面不是你所追求的,你需要描述你的目标。关于订单,您可以使用sort_values。关于“太多的值”,你希望它看起来怎么样?
    • 抱歉我还是不能上传图片,我把加载图片的链接放在驱动器上,这是我想要的,只需要逗号后6个数字的精度
    • 我不确定我是否理解其中的区别,特别是因为图像显示了数字,直方图的定义很明确。我用我现在可以想象的问题更新了答案。
    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2014-06-14
    • 2017-10-07
    • 1970-01-01
    • 2017-08-07
    • 2020-10-24
    相关资源
    最近更新 更多