1. 统计一个列表出现某个数字或者字段的次数
A. 列表推导式法
原理:使用列表推导式找出所有等于0的元素,并用sum()函数计算它们的数量。
这个方法的优点是:可以筛选等于和不等于的,用来统计占比。如果需要筛选的是字符串,也可以把 if sum ==0,的部分改为字符串就好了。
例如,这个需要从列表中筛选出数值为0的个数,结果是出现3次:
numbers = [0, 1, 2, 0, 3, 0, 4]
#查询等于0的数量
count_zero = sum(1 for num in numbers if num == 0)
non_count_zero_=sum(1 for num in numbers if num != 0)
print(count_zero)
# 输出结果是 3
这个写法思路比较清晰,我们可以看到生成式筛选出对应的条件然后用sum进行数量加总,如果sum的括号后面没有1,则是计算出列表的数值的总和。同时,这个方法也能适用于筛选字符串。
B.collections.Counter
这个方法适用于当你需要统计集合中所有元素出现次数的情况
from collections import Counter
# 假设我们有一个数字列表
numbers = [0, 1, 2, 0, 3, 0, 4]
# 使用Counter计算每个元素的出现次数
counter = Counter(numbers)
# 直接获取0出现的次数
count_zero = counter[3]
print(count_zero) # 输出结果将是3
2. 去除列表的nan,做数值统计
当然如果里面混有nan,例如这样的结构的:
[nan, '-20', nan,'-50', nan, nan, '-20', '50', '-100']
如果我们想去掉nan,统计非nan值的方法:
A.使用列表生成式的方法(里面是数值型):
import math
my_list = [1.0, float('nan'), 2.0, 3.0, float('nan'), 4.0]
cleaned_list = [x for x in my_list if not math.isnan(x)]
print(cleaned_list )
#[1.0, 2.0, 3.0, 4.0]
B.使用filter()函数和math.isnan()去除(里面是数值型):
import math
my_list = [1.0, float('nan'), 2.0, 3.0, float('nan'), 4.0]
cleaned_list = list(filter(lambda x: not math.isnan(x), my_list))
print(cleaned_list )
#[1.0, 2.0, 3.0, 4.0]
c. 在含字符串的列表中去除NaN:
上面的方法是在数值型的数据中筛选出NaN,如果是列表中有字符串,可以使用下面的方法:
import math
my_list = [1.0, 'a', float('nan'), 2.0, 'b', 3.0, float('nan'), 'c', 4.0]
cleaned_list = [x for x in my_list if not (isinstance(x, float) and math.isnan(x))]
print(cleaned_list )
#[1.0, 'a', 2.0, 'b', 3.0, 'c', 4.0]
这个方法使用了isinstance(x, float)
来检查元素是否为浮点数。如果是浮点数,再使用math.isnan(x)
检查是否为NaN。
3. 区分列表的正数和负数,并算出正数和负数所占百分比
如果需要做分类,首先需要判断列表里面的数值是不是都是浮点数,如果是字符串,需要全部转化为浮点数
步骤一. 将列表的字符串数字转为浮点数
#使用map()函数
numbers = ["1.5", "-2.3", "0", "3.7", "-4.1", "5.0", "-6.2", "0.0"]
float_list = list(map(float, numbers ))
步骤二. 列表数值的正负值分类
如果我们有一个包含浮点数的列表,可以使用两个列表推导式来分别选出正数和负数:
numbers = [1.5, -2.3, 0, 3.7, -4.1, 5.0, -6.2, 0.0]
positive_numbers = [num for num in numbers if num > 0]
negative_numbers = [num for num in numbers if num < 0]
zero_values = [num for num in numbers if num == 0]
print("Positive numbers:", positive_numbers) #
print("Negative numbers:", negative_numbers) #
print("Zero values:", zero_values) #
#Positive numbers: [1.5, 3.7, 5.0]
#Negative numbers: [-2.3, -4.1, -6.2]
#Zero values: [0, 0.0]
步骤三. 计算所占百分比
如果要计算三者的占比,则三者除以总数就可以啦!
#分别查询这三者的个数
positive_count = len(positive_numbers) #负数的数量
negative_count = len(negative_numbers) #正数的数量
zero_count = len(zero_values) #0的数量
print('正数的数量是:',positive_count)
print('负数的数量是:',negative_count)
print('0的数量是:',zero_count)
#正数的数量是: 3
#负数的数量是: 3
#0的数量是: 2
#计算总数
sum_count=len(numbers )
#计算占比
Positive_ratio=positive_count /sum_count
Negative_ratio=negative_count/sum_count
zero_ratio=zero_count/sum_count
print('价格上涨所占百分比:',Positive_ratio)
print('价格下跌所占百分比:',Negative_ratio)
print('价格不变所占百分比:',zero_ratio)
结果:
价格上涨所占百分比: 0.375
价格下跌所占百分比: 0.375
价格不变所占百分比: 0.25
如果需要把小数换算成百分比,则使用:
#构建一个百分比换算函数
def fraction_to_percentage(numerator, denominator):
percentage=(numerator / denominator) * 100
return f"{percentage}%" #返回字符串格式
Positive_ratio=fraction_to_percentage(positive_count ,sum_count)
Negative_ratio=fraction_to_percentage(negative_count,sum_count)
zero_ratio=fraction_to_percentage(zero_count,sum_count)
print('价格上涨所占百分比:',Positive_ratio)
print('价格下跌所占百分比:',Negative_ratio)
print('价格不变所占百分比:',zero_ratio)
结果:
价格上涨所占百分比: 37.5%
价格下跌所占百分比: 37.5%
价格不变所占百分比: 25.0%
4. 筛选出列表中最大的绝对值和最小的绝对值
思路:
首先使用列表推导式计算列表中每个元素的绝对值,
然后使用max()
和min()
函数分别找出这些绝对值中的最大值和最小值。
numbers = [1.5, -2.3, 0, 3.7, -4.1, 5.0, -6.2, 0.0]
# 计算绝对值并找出最大和最小的绝对值
abs_values = [abs(num) for num in numbers]
max_abs_value = max(abs_values)
min_abs_value = min(abs_values)
print("列表:", numbers)
print("最大绝对值:", max_abs_value)
print("最小绝对值:", min_abs_value)
结果:
列表: [1.5, -2.3, 0, 3.7, -4.1, 5.0, -6.2, 0.0]
最大绝对值: 6.2
最小绝对值: 0