【Python】统计列表出现某个数字/字段的次数+去除列表的nan值+计算列表中的正负值百分比和绝对值

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

在这里插入图片描述

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值