Python科学计算:Pandas (二)

    数据清洗是数据准备中必不可少的环节,下面简单介绍Pandas在数据清洗中的使用方法。这里沿用上一节的虚拟考试成绩。

import pandas as pd
from pandas import Series,DataFrame
data={'Chinese':[66,89,65,67,67],'English':[87,64,86,88,88],'Math':[90,89,87,98,98]}
df2=DataFrame(data,index=['ZhangFei','GuanYu','ZhaoYun','DianWei','DianWei'],columns=['English','Chinese','Math'])

下面介绍数据清洗过程中的几种情况:

删除DataFrame中不必要的列或行

drop()
例如,删去‘Chinese’列

df2=df2.drop(columns=['Chinese'])
print (df2)

运行结果:

            English  Chinese  Math
ZhangFei       87       66    90
GuanYu         64       89    89
ZhaoYun        86       65    87
DianWei        88       67    98
DianWei        88       67    98
            English  Math
ZhangFei       87    90
GuanYu         64    89
ZhaoYun        86    87
DianWei        88    98
DianWei        88    98

    第一个表是未删除语文成绩的表,第二个表是删除语文成绩的表。下面演示删除“张飞”行。

df2=df2.drop(index=['ZhangFei'])

运行结果:

           English  Chinese  Math
GuanYu        64       89    89
ZhaoYun       86       65    87
DianWei       88       67    98
DianWei       88       67    98
重命名列名columns,使列表名更容易识别

rename(columns=new_names,inplace=True)
    例如:将列名“Chinese”改成“语文”,“English”改成“英语”,“Math”改成“数学”。

df2.rename(columns={'Chinese':'语文','English':'英语','Math':'数学'},inplace=True)
print (df2)

运行结果:

        英语  语文  数学
ZhangFei  87   66    90
GuanYu    64   89    89
ZhaoYun   86   65    87
DianWei   88   67    98
DianWei   88   67    98
去重复值

数据采集可能存在重复的行,drop_duplicates()会自动把重复的行去掉。

df2=df2.drop_duplicates()
print (df2)

运行结果:

        英语  语文  数学
ZhangFei  87   66    90
GuanYu    64   89    89
ZhaoYun   86   65    87
DianWei   88   67    98

可以看到,重复的一行,“DianWei”行被过滤掉了。

格式问题
更改数据格式

    很多时候数据格式不规范,使用astype()。例如,将Chinese字段改成str类型或者int64类型。

df2['语文'].astype('str')
df2['语文'].astype(np.int64)
数据间的空格

    我们先把数据转为str型,是为了方便对数据进行操作,这时要删除数据间的空格,可以用函数strip():

df2['语文']=df2['语文'].astype('str')
df2['语文']=df2['语文'].map(str.strip)#删除两边空格
df2['语文']=df2['语文'].map(str.lstrip)#删除左边空格
df2['语文']=df2['语文'].map(str.rstrip)#删除右边空格
print (df2)

若数据中有特殊符号,例如,“语文”字段里有美元符号,需要删除。

df2['语文']=df2['语文'].str.strip('$')
大小写转换

    人名,城市名等的统一,都可能用到大小写的转换,Python中,直接使用upper(),lower(),title(),方法如下:

import pandas as pd
from pandas import Series,DataFrame
data={'Chinese':[66,89,65,67,67],'English':[87,64,86,88,88],'Math':[90,89,87,98,98]}
df2=DataFrame(data,index=['ZhangFei','GuanYu','ZhaoYun','DianWei','DianWei'],columns=['English','Chinese','Math'])
df2['Chinese']=df2['Chinese'].astype('str')
df2.columns=df2.columns.str.upper()#全部大写
print(df2)
df2.columns=df2.columns.str.lower()#全部小写
df2.columns=df2.columns.str.title()#首字母大写

运行结果:

           ENGLISH CHINESE  MATH
ZhangFei       87      66    90
GuanYu         64      89    89
ZhaoYun        86      65    87
DianWei        88      67    98
DianWei        88      67    98

运行结果以字母全部大写为例。

查找空值

    数据量大时,有些字段可能存在空值NaN,这时需要Python中的isnull()函数进行查找。例如以下数据表:

           English  Chinese  Math
ZhangFei       87       66   NaN
GuanYu         64       89  89.0
ZhaoYun        86       65  87.0
DianWei        88       67  98.0
DianWei        88       67  98.0

如果想看哪个位置存在空值,print(df2.isnull()),运行结果如下:

          English  Chinese   Math
ZhangFei    False    False   True
GuanYu      False    False  False
ZhaoYun     False    False  False
DianWei     False    False  False
DianWei     False    False  False

若想知道哪一列有空值,使用df2.isnull().any(),结果如下:

English    False
Chinese    False
Math        True
dtype: bool
使用apply函数对数据进行清洗

    apply函数在Pandas中使用频率比较高,是自由度非常高的函数。如想对name列的值都进行大写转化:

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
data={'name':['ZhangFei','GuanYu','ZhaoYun','DianWei','DianWei'],'Chinese':[66,89,65,67,67],'English':[87,64,86,88,88],'Math':[None,89,87,98,98]}
df2=DataFrame(data)
df2['Chinese']=df2['Chinese'].astype('str')
df2['name']=df2['name'].apply(str.upper)
print(df2)

运行结果:

     name    Chinese  English  Math
0  ZHANGFEI      66       87   NaN
1    GUANYU      89       64  89.0
2   ZHAOYUN      65       86  87.0
3   DIANWEI      67       88  98.0
4   DIANWEI      67       88  98.0

    我们也可以自定义函数,在apply中使用。如定义函数double_df,将“Chinese”列的数值*2处理。

def double_df(x):
    return 2*x
df2[u'Chinese']=df2[u'Chinese'].apply(double_df)
print (df2)

运行结果:

    name      Chinese  English  Math
0  ZhangFei      132       87   NaN
1    GuanYu      178       64  89.0
2   ZhaoYun      130       86  87.0
3   DianWei      134       88  98.0
4   DianWei      134       88  98.0

    可以看到,语文成绩都扩大到了原来的2倍。我们也可以定义更复杂的函数,如在原来数据表的基础上增加两列,‘new1’列表示语文和英语成绩和的m倍,‘new2’列表示语文和英语成绩和的n倍。

def plus(df2,n,m):
    df2['new1']=(df2[u'Chinese']+df2[u'English'])*m
    df2['new2'] = (df2[u'Chinese'] + df2[u'English']) * n
    return df2
df2=df2.apply(plus,axis=1,args=(2,3,))
print (df2)

运行结果:

    name      Chinese  English  Math  new1  new2
0  ZhangFei       66       87   NaN   459   306
1    GuanYu       89       64  89.0   459   306
2   ZhaoYun       65       86  87.0   453   302
3   DianWei       67       88  98.0   465   310
4   DianWei       67       88  98.0   465   310

    其中axis=1代表按照列为轴,axis=0代表按照行为轴进行操作,args是传递两个参数的,n=2,m=3,在plus中使用了n和m,生成了新的df2。

小结

    本节主要讲了几种数据清洗的情况,以及Pandas在数据清洗中的用法。下一节主要介绍数据的统计。
    欢迎大家关注我的个人公众号:小菜鸡的技术之路。大家多多交流,一起学习啊!最后附上我的公众号二维码:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值