如何为单个系列生成频数表(或直方图)?例如,如果有my_series = pandas.Series([1,2,2,3,3,3]),如何得到类似{1: 1, 2: 2, 3: 3}的结果-即每个值在Series中出现的次数?
my_series = pandas.Series([1,2,2,3,3,3])
{1: 1, 2: 2, 3: 3}
Series
4xy9mtcn1#
也许是.value_counts()?
.value_counts()
>>> import pandas >>> my_series = pandas.Series([1,2,2,3,3,3, "fred", 1.8, 1.8]) >>> my_series 0 1 1 2 2 2 3 3 4 3 5 3 6 fred 7 1.8 8 1.8 >>> counts = my_series.value_counts() >>> counts 3 3 2 2 1.8 2 fred 1 1 1 >>> len(counts) 5 >>> sum(counts) 9 >>> counts["fred"] 1 >>> dict(counts) {1.8: 2, 2: 2, 3: 3, 1: 1, 'fred': 1}
drkbr07n2#
您可以在 Dataframe 上使用列表解析来计算列的频率
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
分解:
my_series.select_dtypes(include=['O'])
只选择分类数据
list(my_series.select_dtypes(include=['O']).columns)
将上面的列转换为列表
迭代上面的列表并将value_counts()应用于每个列
ca1c2owp3#
@DSM提供的答案简单明了,但我想我应该在这个问题上添加自己的输入。如果您查看pandas.value_counts的代码,您会发现有很多事情要做。如果您需要计算许多序列的频率,这可能需要一段时间。更快的实现方式是将numpy.unique与return_counts = True一起使用下面是一个例子:
return_counts = True
import pandas as pd import numpy as np my_series = pd.Series([1,2,2,3,3,3]) print(my_series.value_counts()) 3 3 2 2 1 1 dtype: int64
注意,这里返回的项目是一只Pandas。Series相比之下,numpy.unique返回一个包含两个项的元组,即唯一值和计数。
numpy.unique
vals, counts = np.unique(my_series, return_counts=True) print(vals, counts) [1 2 3] [1 2 3]
然后,您可以将这些内容合并到字典中:
results = dict(zip(vals, counts)) print(results) {1: 1, 2: 2, 3: 3}
然后转换为pandas.Series
pandas.Series
print(pd.Series(results)) 1 1 2 2 3 3 dtype: int64
tkclm6bt4#
对于具有过量值的变量的频率分布,您可以将值按类分解,这里我为employrate变量取了过多的值,它的频率分布与直接values_count(normalize=True)没有任何意义
employrate
values_count(normalize=True)
country employrate alcconsumption 0 Afghanistan 55.700001 .03 1 Albania 11.000000 7.29 2 Algeria 11.000000 .69 3 Andorra nan 10.17 4 Angola 75.699997 5.57 .. ... ... ... 208 Vietnam 71.000000 3.91 209 West Bank and Gaza 32.000000 210 Yemen, Rep. 39.000000 .2 211 Zambia 61.000000 3.56 212 Zimbabwe 66.800003 4.96 [213 rows x 3 columns]
values_count(normalize=True)的频率分布,无分类,此处结果长度为139(作为频率分布似乎无意义):
print(gm["employrate"].value_counts(sort=False,normalize=True)) 50.500000 0.005618 61.500000 0.016854 46.000000 0.011236 64.500000 0.005618 63.500000 0.005618 58.599998 0.005618 63.799999 0.011236 63.200001 0.005618 65.599998 0.005618 68.300003 0.005618 Name: employrate, Length: 139, dtype: float64
分类我们将所有值置于一定范围IE内。一个二个一个一个经过分类,我们有了一个清晰的频率分布,这里我们可以很容易地看到,37.64%个国家的就业率在51-60%之间,11.79%个国家的就业率在71-80%之间
37.64%
51-60%
11.79%
71-80%
5.000000 0.376404 7.000000 0.117978 4.000000 0.179775 6.000000 0.264045 8.000000 0.033708 3.000000 0.028090 Name: employrate, dtype: float64
4条答案
按热度按时间4xy9mtcn1#
也许是
.value_counts()
?drkbr07n2#
您可以在 Dataframe 上使用列表解析来计算列的频率
分解:
只选择分类数据
将上面的列转换为列表
迭代上面的列表并将value_counts()应用于每个列
ca1c2owp3#
@DSM提供的答案简单明了,但我想我应该在这个问题上添加自己的输入。如果您查看pandas.value_counts的代码,您会发现有很多事情要做。
如果您需要计算许多序列的频率,这可能需要一段时间。更快的实现方式是将numpy.unique与
return_counts = True
一起使用下面是一个例子:
注意,这里返回的项目是一只Pandas。Series
相比之下,
numpy.unique
返回一个包含两个项的元组,即唯一值和计数。然后,您可以将这些内容合并到字典中:
然后转换为
pandas.Series
tkclm6bt4#
对于具有过量值的变量的频率分布,您可以将值按类分解,
这里我为
employrate
变量取了过多的值,它的频率分布与直接values_count(normalize=True)
没有任何意义values_count(normalize=True)
的频率分布,无分类,此处结果长度为139(作为频率分布似乎无意义):分类我们将所有值置于一定范围IE内。
一个二个一个一个
经过分类,我们有了一个清晰的频率分布,这里我们可以很容易地看到,
37.64%
个国家的就业率在51-60%
之间,11.79%
个国家的就业率在71-80%
之间