python中count()、values_counts()、size()函数

count()函数之详解   https://blog.youkuaiyun.com/JNingWei/article/details/78308815

转载了count()函数,以便自己以后更好的查阅。

string 中 某字符 的次数

str.count(sub, start= 0,end=len(string))

 

ArgsAnnotations
sub搜索的子字符串
start字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
end字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。

list 中 某元素 的次数

list.count(obj)

ArgsAnnotations
obj搜索的list

实验代码

string 中 某字符 的次数


 
  1. # coding=utf-8

  2. string = 'Hello World ! Hello Python !'

  3. print "string.count(sub) : ", string.count('H')

  4. print "string.count(sub, 1) : ", string.count('H', 1)

  5. print "string.count(sub, 1, 100) : ", string.count('H', 1, 100) # 随便取个 无限大的 end 参数

打印结果:

string.count(sub) :  2
string.count(sub, 1) :  1
string.count(sub, 1, 100) :  1

list 中 某元素 的次数


 
  1. list = [10, 20, 30, 'Hello', 10, 20]

  2. print "list.count('Hello') : ", list.count('Hello')

  3. print "list.count(10) : ", list.count(10)

打印结果:

list.count('Hello') :  1
list.count(10) :  2

pandas 的value_counts()函数可以对Series里面的每个值进行计数并且排序。

现有一个DataFrame

如果我们想知道,每个区域出现了多少次,可以简单如下:

每个区域都被计数,并且默认从最高到最低做降序排列。

如果想用升序排列,可以加参数ascending=True:

如果想得出的计数占比,可以加参数normalize=True:

空值是默认剔除掉的。value_counts()返回的结果是一个Series数组,可以跟别的数组进行运算。

value_count()跟透视表里(pandas或者excel)的计数很相似,都是返回一组唯一值,并进行计数。这样能快速找出重复出现的值。

size()和shape () 是numpy模块中才有的函数

size():计算数组和矩阵所有数据的个数 
a = np.array([[1,2,3],[4,5,6]]) 
np.size(a),返回值为 6 
np.size(a,1),返回值为 3

shape ():得到矩阵每维的大小 
np. shape (a),返回值为 (2,3)

另外要注意的是,shape和size既可以作为函数,也可以作为ndarray的属性 
a.size,返回值为 6, 
a.shape,返回值为 (2,3)

 

<think>嗯,用户现在的问题是关于在使用numpy的np.unique函数时,如何不排序values,并且绘制柱状图。我需要先理解用户的需求,然后结合他们提供的引用内容来找到解决方法。 首先,用户提到np.unique默认会返回排序后的唯一值,但用户希望不排序。根据引用[1],np.unique的return_counts=True可以返回唯一值和出现次数,但默认是排序后的。用户希望保持原数据的出现顺序,也就是按照元素首次出现的顺序来输出唯一值。这时候,我需要想到如何禁用排序功能。查阅numpy文档,np.unique有一个参数return_index,当设置return_index=True时,可以返回唯一值在原数组中的索引,这可能对后续处理有帮助。但是用户需要的是不排序的唯一值,所以可能需要结合其他参数,比如return_inverse或者return_index来获取原始顺序。 然后,用户可能想要绘制柱状图。根据之前的回答,引用[3]中提到了生成包含重复值的示例数据,而引用[5]展示了使用value_counts()绘制柱状图的例子。但这里用户希望用np.unique的结果来绘制,同时保持原始顺序。因此,可能需要先处理np.unique的输出,确保唯一值没有排序,然后使用matplotlib或pandas进行绘图。 接下来,我需要考虑如何实现不排序的np.unique。根据numpy的文档,np.unique的参数中有一个return_counts,但没有直接的选项来禁用排序。不过,可以通过组合return_index=True来获取唯一值的首次出现索引,然后根据这些索引的顺序来重新排列唯一值和计数。例如,先获取唯一值和对应的索引,然后根据索引排序唯一值和计数,这样就能得到按照首次出现顺序排列的结果。 例如,对于数组a,使用np.unique(a, return_index=True, return_counts=True),然后根据返回的索引排序唯一值,这样就可以保持原顺序。这可能涉及到对索引进行排序,然后再取唯一值和计数值。 然后,绘制柱状图时,需要确保x轴是按照首次出现的顺序排列的,而不是默认的排序顺序。这可能需要将唯一值转换为字符串或其他形式,保持它们的顺序,然后使用plt.bar来绘制柱状图。 另外,用户可能希望柱状图的x轴标签显示原始的唯一值,而不是排序后的。因此,在绘图时,需要正确设置x轴的刻度和标签。 同时,结合用户之前的问题中提到的柱状图绘制方法,比如引用[2]中的并列柱状图技巧和引用[3]的坐标定位原理,可能需要调整柱状图的位置和样式,确保图表清晰可读。 总结一下,解决步骤应该是: 1. 使用np.unique的参数return_index和return_counts获取唯一值、它们的首次出现索引和计数。 2. 根据首次出现的索引对唯一值和计数进行排序,以保持原始顺序。 3. 使用处理后的唯一值和计数数据绘制柱状图,确保x轴的标签正确显示。 4. 可能的优化包括设置颜色、添加数值标签、调整布局等,参考之前的回答中的最佳实践。 还需要验证这种方法是否正确,比如构造一个测试数组,查看处理后的唯一值是否确实按首次出现顺序排列,并且柱状图正确显示。 例如,给定数组a = [3, 1, 2, 3, 2, 2],默认np.unique会返回[1, 2, 3],但希望得到[3, 1, 2]。通过获取索引并排序,可以得到正确的顺序。 最后,确保代码示例正确,并解释每个步骤的作用,以帮助用户理解。</think>根据您需要保持原始数据出现顺序的需求,结合引用[1]和引用[3]的统计方法,以下是完整的解决方案: ### 核心思路 1. **禁用排序**:通过`return_index=True`获取元素首次出现的索引,结合`np.argsort()`实现非排序输出 2. **数据对齐**:保持唯一值(values)、计数(counts)与首次出现索引的顺序一致性 3. **可视化**:基于原始顺序绘制柱状图,结合引用[5]的柱状图实现方法 ### 完整代码实现 ```python import numpy as np import matplotlib.pyplot as plt # 生成示例数据(含重复值) data = np.array([5, 3, 3, 2, 5, 5, 4, 2, 1, 1, 1]) # 示例数据 # 获取非排序统计结果 values, index, counts = np.unique(data, return_index=True, return_counts=True) # 按首次出现顺序排序(关键步骤) order = np.argsort(index) # 获取原始顺序的索引 sorted_values = values[order] sorted_counts = counts[order] # 绘制柱状图 plt.figure(figsize=(10,6)) bars = plt.bar(range(len(sorted_values)), sorted_counts, color='#2ca02c', edgecolor='black', width=0.6) # 设置坐标轴 plt.xticks(range(len(sorted_values)), sorted_values) # 用实际值作为x轴标签 plt.xlabel("Unique Values", fontsize=12) plt.ylabel("Counts", fontsize=12) plt.title("Value Distribution (Original Order)", fontsize=14) # 添加数值标签 for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height, f'{height}', ha='center', va='bottom') plt.tight_layout() plt.show() ``` ### 关键步骤解析 1. **数据统计**: - 通过`np.unique(data, return_index=True, return_counts=True)`同时获取: - `values`:唯一值(默认排序后) - `index`:各唯一值首次出现的索引 - `counts`:各唯一值的出现次数 - 示例数据输出: ``` values: [1 2 3 4 5] index: [8 3 1 6 0] # 对应各值首次出现位置 counts: [3 2 2 1 3] ``` 2. **顺序重建**: ```python order = np.argsort(index) # 对首次出现索引排序 -> [0,1,3,6,8] sorted_values = values[order] # -> [5,3,2,4,1] ``` - `np.argsort(index)`获取原始数据中数值首次出现的顺序索引[^3] 3. **可视化优化**: - 使用`plt.xticks()`直接显示实际数值而非数组索引 - 采用`#2ca02c`(绿色系)保证色彩辨识度 - 添加黑色边框增强柱体边界识别 ### 输出效果 将生成如下特征的柱状图: - x轴标签按数值首次出现顺序排列(示例数据顺序:5→3→2→4→1) - 每个柱体显示具体计数值 - 自动适配坐标轴范围 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值