【数据分析】Pandas函数详解:案例解析(第25天)

系列文章目录


  1. Pandas函数详解
  2. 排序函数
  3. 聚合函数
  4. 缺失值处理
  5. 日期函数


前言

本文主要通过案例解析的方式详解了Pandas工作中常用函数。


提示:以下是本篇文章正文内容,下面案例可供参考

1 索引和列名操作

1.1 查看索引和列名

# 导入模块
import pandas as pd
# 加载数据集
df = pd.read_csv('data/LJdata.csv')
# 获取区域列为天通苑租房的信息
df2 = df[df['区域']=='天通苑租房']
df2
# 获取df2中价格列
df2_price = df2['价格']
df2_price
# 获取行索引值
# s/df.index
df2_price.index
type(df2_price.index)
df2.index
# 获取行索引值列表中的具体值  通过下标取值
df2.index[0]
# 获取s对象的行索引值
df2_price.keys()
# 获取df的列名
df2.keys()
df2.columns
# 通过列表下标值获取数据值
df2.columns[-1]

1.2 修改索引和列名

  • set_index()方法

    # 通过set_index(keys=[列名])方法设置索引值
    df2.set_index(keys=['区域'])
    # 多列索引为复合索引 -> 了解  
    df2.set_index(keys=['区域','地址'])
    # 读取数据是通过参数指定索引列
    # index_col
    
  • index_col属性

    # 读取数据时通过index_col参数指定索引
    df4 =pd.read_csv('data/LJdata.csv', index_col=['区域'])
    df4
    pd.read_csv('data/LJdata.csv', index_col=['区域', '地址'])
    
  • reset_index()方法

    # 重置行索引 
    # reset_index(drop=)  
    # drop: 是否删除原行索引, 默认不删除(原索引作为df中的一列)
    df4.reset_index()
    # 删除原索引
    df4.reset_index(drop=True)
    # s对象重置索引 返回df对象
    df2_price.reset_index()
    # s对象重置索引 返回s对象
    df2_price.reset_index(drop=True)
    
  • 赋值修改

    必须要获取所有索引和列名, 修改的列表中的数据要和行数/列数相同

    df5 = df2_price.reset_index().head()
    df5
    # 先获取索引和列名
    df5.index
    df5.columns
    # 如何修改列表中的数据  赋值修改
    list1 = [1,2,3,4]
    list1[0]='a'
    list1
    # 赋值修改索引  df索引值数和列表的数据个数相等
    df5.index = [0, 'b', 'c', 'd', 'e']
    df5
    # 赋值修改列名
    df5.columns = ['列名1', '列名2']
    df5
    
  • rename()方法修改

    灵活修改, 可以修改指定的索引或列名

    # df.rename(index={原索引:新索引,...}, columns={原列名:新列名,...}, inplace=)
    # 修改行索引
    df5.rename(index={'b': 1, 'e': 'E'})
    # 修改列名
    df5.rename(columns={'列名1':'id', '列名2':'price'})
    # 同时修改索引和列名
    df5.rename(index={'b':1,'c':2,'d':3,'e':4},columns={'列名1':'id','列名2':'price'},inplace=True)
    df5
    

2 常用计算函数

2.1 排序函数

  • nlargest()

    # 导入模块
    import pandas as pd
    # 加载数据集
    df = pd.read_csv('data/LJdata.csv')
    df2 = df.head(10)
    df2
    # df.nlargest(n, columns=[列名1, 列名2,...])
    # 根据指定的列进行降序操作, 获取前n个数据
    # 获取看房人数列排名前5数据 -> 看房人数值相同时, 再通过价格值比较
    df2.nlargest(n=5, columns=['看房人数', '价格'])
    df2.nlargest(3, '价格')
    
  • nsmallest()

    # df.nsmallest(n=, columns=[列名1, 列名2, ...])
    # 根据指定的列值进行升序操作, 获取前n个数据
    # 获取面积最小的前3条数据
    df2.nsmallest(n=3, columns=['面积'])
    
  • sort_values()

    # df.sort_values(by=[列名1, 列名2, ...], ascending=[True, False, ...])
    # ascending: 排序方式, 默认True 升序, False 降序
    # 对一列数据进行排序 默认升序  order by 面积 asc
    df2.sort_values(by=['面积'])
    # 降序 order by 面积 desc
    df2.sort_values(by=['面积'], ascending=False)
    # 对多列进行排序操作 
    # 第一列中数据值相等时, 以第二列进行排序, ...  order by 看房人数,价格 asc
    df2.sort_values(by=['看房人数','价格'], ascending=True)
    df2.sort_values(by=['看房人数','价格'], ascending=False)
    # 对多列对应不同排序方式的排序操作 order by 看房人数 asc, 价格 desc
    df2.sort_values(by=['看房人数', '价格'], ascending=[True, False])
    
  • sort_index()

    # 对索引进行排序操作
    df2.sort_index(ascending=False)
    

2.2 聚合函数

# 聚合函数一般是和分组结合使用
# 聚合函数单独使用, 是对一列数据进行聚合, 返回一个结果值
# min 最小值, 默认是按列计算 axis=0
df2.min()
# 按行计算 axis=1
df2.min(axis=1)
df2['价格'].min()
# max 最大值
df2.max()
# mean 平均值
df2.mean()
# std 标准差  机器学习
df2.std()
# median 中位数
df2.median()
# sum 求和
# 数值列求和, 非数值列字符串拼接
df2.sum()
# cumsum 累计求和  1 1+2  1+2+3
df2.cumsum()
# count 统计非空值个数
df2.count()
# 统计每行个数
df2.count(axis=1)
# value_counts() 统计不同值出现的次数 分组计算
df2['朝向'].value_counts()
# corr 相关性计算 了解  给机器学习处理数据时, 获取相关性不是很强的列作为特征列进行模型训练
# 计算数值列之间的相关性 -1~1 负数就是负相关, 正数就是正相关
df2.corr()
# quantile 分位数 默认二分位 -> 中位数
# 二八原则 获取1/5分位值, 根据分位值获取20%数据
df2.quantile() 
# 通过q参数自定义分位
df2.quantile(q=[0, 0.25, 0.5, 0.75, 1])
df2['价格'].quantile(q=[0,1/3, 2/3, 1])
# 根据价格获取前75%的数据
df2[df2['价格']<7725] 

2.3 练习

# 找到租金最低和最高的房子的全部信息
# 找到最近新上的10套房源
# 每套房子的平均租房价格-元/平米  所有房子平均价格
# 统计不同户型的房源数量

3 缺失值处理

3.1 缺失值概念

数据中都会存在缺失值

pandas中的缺失值用numpy中的NaN,NAN,nan值表示

sql中的缺失值用NULL,null表示

python中的缺失值用None表示

也可以用一些特定的值表示缺失值 missing,0,空字符串

缺失值是不参与统计计算的

from numpy import NAN, NaN, nan
# 缺失值不等于0,'',bool值
print(NAN == 0)
print(nan == '')
print(nan == True)
print(nan == False)
# 缺失值之间也是不相等
print(NAN==NAN)
print(NAN==NaN)
# 缺失值如何产生的?
# 数据采集过程中, 是没有采集到数据
# 计算过程中, 产生缺失值 -> sql关联, 关联不上的用缺失值填充

3.2 加载包含缺失值数据

import pandas as pd
# 加载城市天气数据集
df = pd.read_csv('data/city_day.csv')
df
# 缺失值不参与统计
df.count()
# 加载数据集时, 不转换空值
# keep_default_na:默认True, 将空值用NaN值表示
new_df = pd.read_csv('data/city_day.csv', keep_default_na=False)
new_df
new_df.count()
# 指定数据值用NaN值替换
# missing、空字符串、0等值可以表示的是NaN值
# city列用Ahmedabad表示的是NaN值
# na_values:指定某些数据值在加载时用NaN替换
pd.read_csv('data/city_day.csv', keep_default_na=False, na_values=['Ahmedabad', '2015-01-01'])
# 可以通过replace函数实现替换
df.replace(to_replace='Ahmedabad', value=NaN)

3.3 查看缺失值

# 通过info方法进行查看
df.info()
# isnull/isna判断数值是否是缺失值 返回True False
# notnull/notna判断数值是否不是缺失值 返回True False
df.head().isnull()
df.isna()
# 如果值不是缺失值, 返回True
df['PM2.5'].head().notnull()
df.head().notna()
# 统计每列缺失值数量
# 布尔值进行数值计算时,True转换成1,False转换成0
df.isnull().sum()
# 统计每行缺失值数量
df.isna().sum(axis=1)
# 统计每列非缺失值数量
df.count()
# 通过missingno模块 可视化展示缺失值 -> 了解
# 在jupyter中安装模块, 前边加一个 !
!pip install missingno -i https://pypi.tuna.tsinghua.edu.cn/simple/
import missingno as msno
import matplotlib.pyplot as plt
# 绘制缺失值柱状图
msno.bar(df)
plt.show()
# 绘制缺失值位置图形
msno.matrix(df)
# 随机获取100条数据
df.sample(100)
msno.matrix(df.sample(100))
# 绘制缺失值相关性图形
msno.heatmap(df)

3.4 缺失值处理

3.4.1 删除缺失值
# 一般情况下不建议删除行或列, 除非是缺失值占比很高 80%以上 
# 删除行列 drop()
# df.dropna()
# 随机获取10条数据
# random_state:随机数种子, 了解
df2 = df.sample(n=10, random_state=5)
df2
# 按行删除包含缺失值的行数据
df2.dropna(how='any')
# 统计每行缺失值的数量
df2.isnull().sum(axis=1)
# 删除每行的数据都为缺失值的行数据
df2.dropna(how='all')
# 按列删除缺失值的列
df2.dropna(axis=1)
# 统计每列中缺失值的数量
df2.isnull().sum()
# 删除指定列中包含缺失值的行数据
# subset
df2.dropna(subset=['PM10', 'NH3'])
# 删除缺失值行数据之后, 非空值个数大于等于指定的阈值时, 会保留当前行
df2.dropna(thresh=12)
df.isnull().sum()
# 通过drop方法删除缺失值占比很高的列
df.drop(labels=['Xylene'],axis=1)
3.4.2 填充缺失值
  • 固定值填充

    # df.fillna(value=)
    # 使用常数值或统计值填充缺失值
    df2 = df.copy()
    df2
    # 用常数填充
    # 例如: 性别列 男,女  缺失值可以用未知进行填充(问业务方)
    df2['PM2.5'].fillna(value='未知')
    df2.fillna(value='未知')
    df2['PM2.5'].mean()
    # 使用统计值填充缺失值 平均值,最大最小值,众数
    df2['PM2.5'] = df2['PM2.5'].fillna(value=df2['PM2.5'].mean())
    df2
    
  • 前后值填充

    # 使用缺失值的前后非缺失值填充 -> 对时间序列数据
    temp_s = df['Xylene'][54:64]
    temp_s
    # 使用缺失值的上一个非缺失值填充
    # method: ffill:前一个非缺失值  bfill:后一个非缺失值
    temp_s.fillna(method='ffill')
    temp_s.fillna(method='bfill')
    
  • 线性填充

    # 线性填充法
    # 认为值之间存在一个线性关系, 自动用线性值填充
    temp_s.interpolate()
    

4 pandas数据类型

4.1 类型转换

import pandas as pd
df = pd.read_csv('data/city_day.csv')
df.info()
# 类似于sql中的cast操作
# s.astype(内置类型名)
# 查看列类型
df['PM2.5'].dtype
# 转换成字符串类型
df['PM2.5'] = df['PM2.5'].astype('str')
df.info()
# 转换成浮点类型
df['PM2.5'].astype('float')
# 构造包含 missing字符的数据
df2 = df.head().copy()
df2
# 将1,3,5行的NO列值替换成missing
df2.loc[::2, 'NO'] = 'missing'
df2
# 发生报错, missing不能转换成float类型
df2['NO'].astype('float')
# pd.to_numeric()
# raise: 如果不能转换会抛出异常
pd.to_numeric(df2['NO'], errors='raise')
# coerce: 强制转换, 非浮点值用NaN值替换
pd.to_numeric(df2['NO'], errors='coerce')
# ignore: 不发生转换,也不发生报错
pd.to_numeric(df2['NO'], errors='ignore')

4.2 category类型

# 创建category类型
# data接受的是一个分类对象 pd.Categorical(values=, categorires=)
s1 = pd.Series(data=pd.Categorical(values=['a', 'b', 'c', 'd'], categories=['a', 'b', 'c']))
s1
s2 = pd.Series(data=['a', 'b', 'c', 'd', 'a', 'b'],dtype='category')
s2
# 转换df中列的类型为category类型
df.info()
df['City'] = df['City'].astype('category')
df.info()

4.3 日期时间类型

  • python日期时间

    # python中通过datetime/time模块获取日期时间
    import datetime
    t1 = datetime.datetime.now()
    t1
    type(t1)
    someday = datetime.datetime(2024,2,24)
    someday
    import time
    time.time()
    from datetime import datetime
    # format -> 将日期时间类型转换成字符串日期
    a = datetime.strftime(t1, '%Y-%m-%d')  
    print(a)
    type(a)
    datetime.strptime(a, '%Y-%m-%d')  # parse -> 将字符串日期转换成日期时间类型
    
  • 日期类型转换

    # 读取数据时将列解析成日期时间类型
    # parse_dates: 指定列名或列下标
    new_df = pd.read_csv('data/city_day.csv', parse_dates=['Date'])
    new_df.info()
    # 通过pd.to_datetime(列名)方法转换成日期时间类型
    df = pd.read_csv('data/city_day.csv')
    df['Date'] = pd.to_datetime(df['Date'])
    df.info()
    
    df = pd.read_csv('data/city_day.csv')
    df.info()
    # 通过astype方法转换成日期时间类型
    df['Date'].astype('datetime64[ns]')
    
  • 提取日期时间列中部分数据

    # 提取日期时间类型中部分数据
    # .dt -> 获取一列中的部分数据
    new_df['year'] = new_df['Date'].dt.year
    new_df
    new_df['Date'].dt.month
    
    t2 = datetime(2024,2,24)
    t2
    # 获取一个值中的部分数据
    t2.year
    t2.month
    t2.day
    
  • 日期时间运算

    # 获取Date列中最小日期
    new_df['Date'].min()
    # 日期时间作差, 得到天数差值 timedelta64[ns] 时间差类型
    new_df['Date'] - new_df['Date'].min()
    
  • 日期时间索引

    # 设置日期时间列为索引
    df = pd.read_csv('data/city_day.csv',index_col=['Date'], parse_dates=True)
    df.index
    # 使用日期时间获取部分数据之前,需要对索引列进行排序
    df = df.sort_index()
    # 获取2018年的数据
    df['2018']
    # 获取2018-08的数据
    df['2018-08']
    # 获取时间范围内的数据
    df.loc['2018-08-01 22':'2019-01-01 23:11:12']
    

4.4 时间差类型

  • python中timedelta类型

    from datetime import datetime
    now = datetime.now()
    print(now)
    t1 = datetime(2024,2,22)
    print(t1)
    diff = now-t1
    print(diff)
    print(type(diff))
    
  • 时间差类型转换

    df = pd.read_csv('./data/city_day.csv', parse_dates=[1])
    df.info()
    # 日期时间作差得到时间差类型
    ref_date = df['Date'] - df['Date'].min()
    ref_date
    # 转换成时间差类型
    s1 = ref_date.astype('object')
    s1
    pd.to_timedelta(s1)
    s1.astype('timedelta64[ns]')
    
  • 时间差索引

    # 时间差类型设置成索引
    df = pd.read_csv('./data/city_day.csv', parse_dates=[1])
    # 将时间差列设置为索引
    df.index = df['Date'] - df['Date'].min()
    df = df.sort_index()
    # 需要先对索引排序, 然后根据范围获取部分数据
    df['0 days':'4 days']
    

    在这里插入图片描述

  • 37
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据飞总

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值