将字符串的Pandas DataFrame转换为直方图

yebdmbv4  于 2023-09-29  发布在  其他
关注(0)|答案(4)|浏览(103)

假设我创建了一个DataFrame,如下所示:

import pandas as pd
s1 = pd.Series(['a', 'b', 'a', 'c', 'a', 'b'])
s2 = pd.Series(['a', 'f', 'a', 'd', 'a', 'f', 'f'])
d = pd.DataFrame({'s1': s1, 's2', s2})

真实的数据中的字符串有相当多的稀疏性。我想创建字符串出现的直方图,它看起来像是由d.hist()生成的(例如:对于S1和S2(每个子图一个)具有子图)。
仅仅执行d.hist()就会产生这样的错误:

/Library/Python/2.7/site-packages/pandas/tools/plotting.pyc in hist_frame(data, column, by, grid, xlabelsize, xrot, ylabelsize, yrot, ax, sharex, sharey, **kwds)
   1725         ax.xaxis.set_visible(True)
   1726         ax.yaxis.set_visible(True)
-> 1727         ax.hist(data[col].dropna().values, **kwds)
   1728         ax.set_title(col)
   1729         ax.grid(grid)

/Library/Python/2.7/site-packages/matplotlib/axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
   8099             # this will automatically overwrite bins,
   8100             # so that each histogram uses the same bins
-> 8101             m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
   8102             if mlast is None:
   8103                 mlast = np.zeros(len(bins)-1, m.dtype)

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/function_base.pyc in histogram(a, bins, range, normed, weights, density)
    167             else:
    168                 range = (a.min(), a.max())
--> 169         mn, mx = [mi+0.0 for mi in range]
    170         if mn == mx:
    171             mn -= 0.5

TypeError: cannot concatenate 'str' and 'float' objects

我想我可以手动浏览每个系列,做一个value_counts(),然后将其绘制为条形图,并手动创建子图。我想看看有没有更简单的方法。

eivgtgni

eivgtgni1#

重新创建数据框:

import pandas as pd
s1 = pd.Series(['a', 'b', 'a', 'c', 'a', 'b'])
s2 = pd.Series(['a', 'f', 'a', 'd', 'a', 'f', 'f'])
d = pd.DataFrame({'s1': s1, 's2': s2})

要根据需要获取具有子图的直方图,请执行以下操作:

d.apply(pd.value_counts).plot(kind='bar', subplots=True)

OP在问题中提到了pd.value_counts。我认为缺失的部分只是没有理由“手动”创建所需的条形图。
d.apply(pd.value_counts)的输出是一个pandas dataframe。我们可以像绘制任何其他 Dataframe 一样绘制值,选择选项subplots=True就可以得到我们想要的结果。

yjghlzjz

yjghlzjz2#

你可以使用pd.value_counts(value_counts也是一个series方法):

In [20]: d.apply(pd.value_counts)
Out[20]: 
   s1  s2
a   3   3
b   2 NaN
c   1 NaN
d NaN   1
f NaN   3

然后绘制得到的DataFrame。

iugsix8n

iugsix8n3#

我会将该系列文件压缩到collections.Counter(文档)中(您可能需要先将其转换为列表)。我不是pandasMaven,但我认为您应该能够将Counter对象折叠回Series,由字符串索引,并使用它来绘制图表。
这不起作用,因为当它试图猜测bin边缘应该在哪里时,它(正确地)引发了错误,这对字符串毫无意义。

vngu2lb8

vngu2lb84#

您也可以用途:

df_normalized["configuration.runtime"].value_counts().plot(kind = 'barh') # or bar

因为value_counts已被弃用。

相关问题