pandas 处理数据7步

欢迎访问个人博客http://www.jkraise.top

一,数据预处理

准备工作

首先 安装pandas

pip install pandas

导包 pandas

import pandas as pd

加载 数据集,代码如下

data = pd.read_csv('../data/move.csv')

Pandas 提供了一些选择的方法,

  • 查看一列的一些基本统计信息: data.columnname.describe()

  • 选择一列:dada['columnname']

  • 选择一列的前几行数据:data['columnname'][:n]

  • 选择多列:data[['column1', 'column2']]

  • Where 条件过滤:data[data['columnname'] > condition]

    import pandas as pd
    
    
    data = pd.read_csv('movie_metadata.csv')
    # 打印 前5行数据
    # print(data.head())
    
    # 打印 某列 前5行
    # print(data['director_name'][:5])
    
    # 打印 多列 数据
    # print(data[['director_name', 'aspect_ratio']])
    
    # 打印 多列 5行 数据
    # print(data[['director_name', 'aspect_ratio']][:5])
    
    
    

处理缺失数据

一般有这几个方法,

  • 为缺失数据赋值默认值

  • 去掉/删除缺失数据行

  • 去掉/删除缺失率高的列

添加默认值

  • 我们去掉NaN值,我们检查了“country”列,这一列表示地区,然而有一些电影没有提供地区,我们将 ”country“ 整个列,使用 “” 空字符串替换了,或者,我们可以使用"None Given" 进行替换,

    # 添加默认值 ''
    # data.country= data.country.fillna('')
    
  • 使用数字类型的数据(计算电影的平均值)

    data.duration = data.duration.fillna(data.duration.mean())
    

    如果想了解更多 fillna() 的详细信息参考pandas.DataFrame.fillna

删除不完整的行

假设,我们想删除任何有缺失值的行,这种操作太据侵略性,但是我们可以根据的我们的需要进行扩展

  • 删除任何包含NA值的行

    data.dropna()
    
  • 当然我们可以删除一整行的值为NA:

    data.dropna(how='all')
    
  • 我们可以加条件,在一行中有多少非空值的数据是可以保留下来的(例子中,行数据中至少有5个非空值)

    data.drop(thresh=5)
    
  • 比如说,我们不想要不知道电影上映时间的数据:

    data.dropna(subset=['title_year'])
    

    上面的subset 参数允许我们选择想要检查的列,如果是多个列,可以使用列名的list 作为参数

删除不完整的列

我们可以使用axis=1 参数,这个意思就是操作列而不是行,(如果我们不传参数axis,默认是axis=0)

  • 删除一整列为NA的列:

    data.drop(axis=1, how='all')
    
  • 删除任何包含空值的列

    data.drop(axis=1,how='any')
    

    这里也可以使用上面一样的threshold 和subset 更多的详情和案例,请参考pandas.DataFrame.dropna

规范化数据类型

#数据类型转换:字符串转换为日期
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT

DataDF.loc[:,'InvoiceDate']=pd.to_datetime(DataDF.loc[:,'InvoiceDate'],
                                           format='%d/%m/%Y', 
                                           errors='coerce')

#!!⚠️ format 是你[原始数据]中日期的格式

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rg45ArvI-1608800736191)(pandas数据清洗.assets/1606058177255.png)]

调整后

在这里插入图片描述

修改列名

#建立字典字典:旧列名和新列名对应关系
colNameDict = {'InvolceDate':'SaleDate','StockCode':'StockNo'}     

#!! ⚠️一定要旧列名放在冒号前
#每组对应关系以[逗号]隔开

salesDf.rename(columns = colNameDict,inplace=True)

选择部分子集

#选择子集,选择其中一列
subDataDF1=DataDF["InvoiceDate"]


#选择子集,选择其中两列
subDataDF1=DataDF[["InvoiceDate","UnitPrice"]]

利用切片筛选数据功能 df.loc

loc资料,文档

subDataDF1=DataDF.loc[:,"InvoiceDate"]
subDataDF1
#单一个冒号意味着不作限制的全选

在这里插入图片描述

在这里插入图片描述

subDataDF2=DataDF.loc[0:9,:]
subDataDF2

在这里插入图片描述

subDataDF3=DataDF.loc[1:9,"StockCode":"CustomerID"]
subDataDF3

在这里插入图片描述

逻辑问题需要筛选

还是Dataframe.loc这个函数的知识点。

由于loc还可以判断条件是否为True

DataDF.loc[:,'UnitPrice']>0

在这里插入图片描述

#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=DataDF.loc[:,'Quantity']>0
#应用查询条件
print('删除异常值前:',DataDF.shape)
DataDF=DataDF.loc[querySer,:]
print('删除异常值后:',DataDF.shape)

在这里插入图片描述

格式化处理

str().
upper()
lower()
title() 
lstrip()
strip()

DataDF['Description']= DataDF['Description'].str.strip()

空格分割

#定义函数:分割InvoiceDate,获取InvoiceDate
#输入:timeColSer InvoiceDate这一列,是个Series数据类型
#输出:分割后的时间,返回也是个Series数据类型

def splitSaletime(timeColSer):
    timeList=[]
    for value in timeColSer:
        #例如2018/01/01 12:50,分割后为:2018-01-01
        dateStr=value.split(' ')[0]
        timeList.append(dateStr)
#将列表转行为一维数据Series类型
    timeSer=pd.Series(timeList)
    return timeSer


在赋值回去

DataDF.loc[:,'InvoiceDate']=splitSaletime(DataDF.loc[:,'InvoiceDate']) 

处理缺失值

# 再一次提醒检查缺失数据

DataDF.isnull().sum().sort_values(ascending=False)

去除缺失值的知识点:

DataFrame.dropna

DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

# 默认(axis=0)是逢空值剔除整行,设置关键字参数axis=1表示逢空值去掉整列
# 'any'如果一行(或一列)里任何一个数据有任何出现Nan就去掉整行,
  ‘all’一行(或列)每一个数据都是Nan才去掉这整行

DataDF.dropna(how='any')
DataDF.dropna(how='all')

# 更精细的thresh参数,它表示留下此行(或列)时,要求有多少[非缺失值]
DataDF.dropna(thresh = 6 )

以上内容,参考于https://zhuanlan.zhihu.com/p/32572237 这篇知乎,侵权必删,

以上内容,参考于https://zhuanlan.zhihu.com/p/60241672 这篇知乎,侵权必删,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值