将直方图从Python导出到Excel
我是相当新的编码,我需要一些帮助,出口数据或只是打印在Python shell。 代码是:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import openpyxl data = pd.read_excel('/Users/user/Desktop/Data/Book1.xlsx') df = data.hist(bins=40) plt.xlim([0,1000]) plt.title('Data') plt.xlabel('Neuron') plt.ylabel('# of Spikes') plt.show()
因此,代码将数据合并为40个分档后,会生成一个直方图,范围为0到1558.5左右。 我试图做的是导出数据后binning,因为当我试着写:
writer = pd.ExcelWriter('/Users/user/Desktop/Data/output.xlsx') df1.to_excel(writer,'Sheet2') writer.save()
它保存的是原始数据,而不是应用了直方图的数据,并且已经应用了分箱。 另外,如果我可以在0到5,5到10等的范围内获得一些帮助,基本上它的读取间隔是5,一直到数据的末尾,所以它最终会停止在最后一点的数据,并将这些数据粘贴到一个bin中。 任何帮助表示赞赏,并不一定是特别pandas。 谢谢。 顺便说一下,我认为我所做的是从导入的数据中获得一个数据框,而且只是一个初学者,所以不太确定。
行df = data.hist(bins=40)
实际上并不创build分箱数据的DataFrame。 ndarray
结束了拿着一个包含matplotlib.axes._subplots.AxesSubplot
对象的numpy ndarray
。
保存分箱数据的一种方法是通过matplotlib的hist()
创build直方图。 在read_excel
行之后直接添加以下行:
import matplotlib.pyplot as plt counts, bins, bars = plt.hist(data.values, bins=40) df = pd.DataFrame({'bin_leftedge': bins[:-1], 'count': counts})
然后,如评论中所指出的那样,确保将df1.to_excel(writer,'Sheet2')
更改为df.to_excel(writer,'Sheet2')
。
容器包含每个容器的边缘,所以容器数组将比counts
数组多一个元素。 请记住,上面的代码将每个计数与该计数bin的左边相关联,并且不保存最右边的bin边。
可能有一个更好的或pandas习惯的方式来做到这一点,但希望以上满足您的需求。
编辑:整数箱宽度
您可以将bin边缘list
作为bins=
传递给data.hist()
或plt.hist()
。 要创build从0开始并且包含数据的最大值的宽度为5的块,这应该工作:
counts, bins, patches = plt.hist(data.values, bins=range(0, max(data.values)+5, 5))
说明:Python的内置range(start, stop, step)
只接受整数,并返回一个包含左端点( start
)但排除正确端点( stop
)的列表。 (在math符号中, range(start, stop, step)
以半开区间[start, stop)
range(start, stop, step)
返回均匀隔开的整数。)上面行中的+5
确保最后一个仓的右边在右侧结束的最大数据值。