python打卡day4

初识pandas库与缺失数据的补全

按照示例代码的要求,去尝试补全信贷数据集中的数值型缺失值

  1. 打开数据(csv文件、excel文件)
  2. 查看数据(尺寸信息、查看列名等方法)
  3. 查看空值
  4. 众数、中位数填补空值
  5. 利用循环补全所有列的空值

对数据进行查看和处理前,先导入一下库,本质上就是封装了很多类啊函数啊的包,可导入全部也可导入部分,导入库就是为了用别人写好的东西。今天的内容只需要 pandas 库和 numpy 库,pandas:提供高性能、易于使用的数据结构如 DataFrame 和 Series,可方便地进行数据清洗、转换、聚合、可视化等操作,为机器学习提供高质量的数据输入。numpy:提供高效的多维数组对象 ndarray 及各类数学运算功能,能实现快速的数据处理、线性代数计算与随机数生成,是科学计算、数据分析和机器学习的基础支撑库。

DataFrame:是一个二维的带标签数据结构,类似于 Excel 表格或者 SQL 数据库中的表,由行和列组成,每一列可以是不同的数据类型,例如一列可以是整数,另一列可以是字符串,可看作是由多个Series 组成的

Series:本质上是一维带标签的数组,它可以存储任意类型的数据,通常情况下,Series 中的所有元素都属于同一种数据类型

!pip install pandas -i https://mirrors.aliyun.com/pypi/simple/ # 用阿里的源安装一下pandas库,现在是在jupyter里运行,运行一次就安装好了,之后可以删了这句
#pip install pandas -i https://mirrors.aliyun.com/pypi/simple/ # 也可以在编译器的终端安装,也可以再anaconda进入环境安装,推荐后者
import pandas as pd # 导入pandas库

1.打开数据(csv文件、excel文件)

data = pd.read_csv(r'python60-days-challenge-master\data.csv') # 调用pandas库中用于读取 CSV 文件的函数
type(data) # 看一下数据类型
# 结果为pandas.core.frame.DataFrame,说明将 CSV 文件读取为 DataFrame 对象

文件路径前的 r 前缀表示"原始字符串"(raw string),防止 Python 将路径里的反斜杠解释为转义字符比如 "\nature.csv" 不加 r 前缀就不行了,所以即使路径中没有特殊字符,使用 r 也是一个好习惯。我这里用的相对路径,也可以用绝对路径,无所谓的

对于 excel 文件,要安装一个openpyxl库,别的都大差不差

2.查看数据(尺寸信息、查看列名等方法)

data.head(10)  # 查看前十行数据,不改参数默认前五行

data.info() # 查看数据基本信息,行数、列数、列名、每列非空值和数据类型

只想看行数列数,用 data.shape,只想看列名,用 data.columns,只想看每列数据类型,用 data.dtypes,这都是data的属性,上面俩都是data的方法。面向对象的编程中,类包含方法和属性,方法是类中定义的函数,通常描述为"执行某个操作";属性是类中定义的变量,通常描述为"返回某个值",注意区分

只想看指定列的数据类型,用 data["Id"].dtype

辨析一下 data["Id"].dtype 和 type(data["Id"]):

  • type() 回答:"这是什么对象?",用于检查对象类型(即数据结构的类型,例 pandas 里面的两类 DataFrame 和 Series)
  • dtype 回答:"这个对象里装的是什么类型的数据?",用于检查数据类型(即数据具体内容的类型,例整数、浮点、字符串、布尔值等)其实从名字上也好分辨,dtype = data type

3.查看空值

data.isnull()  # 布尔矩阵显示缺失值,这个方法返回一个布尔矩阵,其中True表示对应位置的值是缺失值,False表示对应位置的值不是缺失值

所以调用了data.isnull() 函数后返回的是一个布尔值的矩阵,查看数据结构类型也应该是 DataFrame

布尔矩阵虽然显示了如何找到每一列哪个位置有缺失值,但位置太多了也不便于我们统计具体每列有几个数据缺失,可以考虑每列求和 (True = 1 = 缺失,False = 0 =非空)

data.isnull().sum() # 每列缺失值计数,sum方法为求每一列的和,data.isnull() 也是对象,也有 sum() 这个方法,所以可以这样写

4.众数、中位数填补空值

众数填补

mode = data['Annual Income'].mode() # 求众数
print(mode) # 这一步执行完了这一列有5个众数,选一个填不然报错
data['Annual Income'] = data['Annual Income'].fillna(mode[1]) # 用众数填充,调用 fillna() 函数
#data['Annual Income'].fillna(mode, inplace=True) # inplace=True时返回None表示直接在原DataFrame上进行修改
# 系统给了警告,还是创建一个新的DataFrame安全
data['Annual Income'].isnull().sum() # 再看看填完了还有没有缺失值

中位数填充

data = pd.read_csv(r'python60-days-challenge-master\data.csv') # 刚才执行完数据变了,重新读一下数据
median = data['Annual Income'].median() # 求中位数
print(median)
data['Annual Income'] = data['Annual Income'].fillna(median) # 用中位数填充,调用 fillna() 函数
data['Annual Income'].isnull().sum()

5.利用循环补全所有列的空值

根据刚才查看空值,需要找到所有有缺失值的列,并且列的数据类型为数值的,并且遍历这些列依次填补缺失值。很显然这些列的数据结构不是列表,如果需要修改或进行复杂操作,转换为列表更方便numpy库的 tolist() 可以实现将numpy数组和pandas对象转换成list

import numpy as np
columns_list = data.columns.tolist() # 将数据的列转换成列表
for i in columns_list: # 遍历每一列
    if data[i].dtype in ['int64', 'float64']: # 该列数据类型为数值型时
        if data[i].isnull().sum() > 0: # 有缺失值
            median = data[i].median()
            data[i] = data[i].fillna(median)
data[i].isnull().sum()

收获心得:

学的东西挺多的,都有在上面提到,就不赘述了

@浙大疏锦行

Python中实现打卡兑换礼物的功能,通常会涉及到以下几个步骤: 1. **数据结构设计**:创建一个数据库或数据结构来存储用户的打卡记录,比如字典或列表,其中每个元素包含用户ID、日期等信息。 ```python users_gifts = {} # 使用字典,key为用户ID,value为打卡记录 ``` 2. **添加打卡功能**:编写函数,当用户调用时,检查用户是否存在并更新打卡次数。例如,可以使用`datetime`库来记录每日打卡时间。 ```python import datetime def check_in(user_id): today = datetime.datetime.now().strftime("%Y-%m-%d") if user_id not in users_gifts: users_gifts[user_id] = {today: 1} else: if today not in users_gifts[user_id]: users_gifts[user_id][today] = 1 else: users_gifts[user_id][today] += 1 ``` 3. **条件判断与兑换规则**:设定一个规则,如连续7天打卡即可兑换一份礼物。可以遍历用户的打卡记录,检查是否符合条件。 ```python def can_exchange(user_id): user_history = users_gifts.get(user_id, {}) consecutive_days = {} for date, count in user_history.items(): if date - consecutive_days.get(date, '') <= datetime.timedelta(days=6): # 连续6天 consecutive_days[date] = count if len(consecutive_days) == 7: # 找到7连日 return True return False ``` 4. **兑换操作**:如果满足兑换条件,可以删除已达到兑换的打卡记录,并通知用户兑换成功。 ```python def redeem_gift(user_id): if can_exchange(user_id): for day, _ in list(users_gifts[user_id].items())[:7]: # 删除前7天的打卡记录 del users_gifts[user_id][day] print(f"恭喜用户{user_id},您的7天连续打卡已成功兑换礼物!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值