Python/Pandas DataFrame 中的频率图
Posted
技术标签:
【中文标题】Python/Pandas DataFrame 中的频率图【英文标题】:Frequency plot in Python/Pandas DataFrame 【发布时间】:2014-12-16 02:03:35 【问题描述】:我有一个已解析的非常大的数据框,其中包含一些像这样的值和几列:
Name Age Points ...
XYZ 42 32pts ...
ABC 41 32pts ...
DEF 32 35pts
GHI 52 35pts
JHK 72 35pts
MNU 43 42pts
LKT 32 32pts
LKI 42 42pts
JHI 42 35pts
JHP 42 42pts
XXX 42 42pts
XYY 42 35pts
我已经导入了 numpy 和 matplotlib。
我需要绘制“点”列中的值出现的次数的图表。我不需要任何用于绘图的垃圾箱。因此,更多的是查看在大型数据集上出现相同分数的次数。
所以基本上条形图(或直方图,如果你可以这样称呼它)应该显示 32pts 出现三次,35pts 出现 5 次,42pts 出现 4 次。如果我可以按排序顺序绘制值,那就更好了。我试过 df.hist() 但它不适合我。 有什么线索吗?谢谢。
【问题讨论】:
使用df['Points'].value_counts()
的结果
哦。我这样做并打印值。但无法将其绘制为图形(类似于直方图)......这就是问题所在。
保存对象并绘制它。
谢谢。另外,你能说我如何从列中删除非数字字符吗?就像我想从 32pts 中删除 pts 这样它就不会像字符串一样对待它......
这是一个完全不同的问题。您可以在此网站上找到有关此类问题的大量资源。既然你是新来的,我会给你一根骨头,让你开始我的回答。
【参考方案1】:
直接绘制dataframe的value_count
方法的结果即可:
import matplotlib.pyplot as plt
import pandas
data = load_my_data()
fig, ax = plt.subplots()
data['Points'].value_counts().plot(ax=ax, kind='bar')
如果您想从列中的所有元素中删除字符串“pnts”,您可以执行以下操作:
df['points_int'] = df['Points'].str.replace('pnts', '').astype(int)
假设它们都以“pnts”结尾。如果它因行而异,则需要查看如下正则表达式: Split columns using pandas
以及官方文档:http://pandas.pydata.org/pandas-docs/stable/text.html#text-string-methods
【讨论】:
嗯...谢谢。我确实安装了库,但绘图没有显示出来。我还缺少其他东西吗?是否需要启用其他功能才能查看这些图?我正在开发一个运行 Ubuntu 14.04 的虚拟机 最快的方法是使用fig.savefig(<path_to_figure>)
将图形保存为文件。您还可以定义一个交互式后端供 matplotlib 使用,但这也已在其他几个关于 SO 的问题中讨论过。 (@SMU)
@PaulH 我只是想知道如何让这个图按值而不是频率排序。
data['Points'].value_counts().sort_index().plot(ax=ax, kind='bar')
按值排序【参考方案2】:
Seaborn 包有countplot
函数,可以用来制作频率图:
import seaborn as sns
ax = sns.countplot(x="Points",data=df)
【讨论】:
您应该将代码缩进四次(第二行)。然后该行将显示为代码。此外,您可以用 ` 包围单词“countplot”。然后它会显示为“... hascountplot
function...”。以上是关于Python/Pandas DataFrame 中的频率图的主要内容,如果未能解决你的问题,请参考以下文章
python: pandas.DataFrame,如何避免keyerror?
Python Pandas 中 DataFrame 的聚合?