数据分析实战45讲(五)Pandas(下)

上一篇文章主要介绍了Pandas的Series和DataFrame这两个数据结构,内容不全面,要了解其全面的使用方法,可以去官网或者阅读《利用python进行数据分析》。
1.数据导出和输入
Pandas允许直接从xlsx,csv等文件中导入数据,也可以输出到xlsx, csv等文件,非常方便。当然也不仅限于这几个格式。

#将数据从excel表格中读取并且复制到data1excel表中
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')

2.数据清洗
数据清洗是数据准备过程中必不可少的环节,Pandas也为我们提供了数据清洗的工具,在后面数据清洗的部分中会做详细的介绍,这里简单介绍下Pandas在数据清洗中的使用方法。

data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print(df2)
            English  Math  Chinese
ZhangFei         65    30       66
GuanYu           85    98       95
ZhaoYun          92    96       93
HuangZhong       88    77       90
DianWei          90    90       80

2.1 删除DataFrame中不必要的列或行

df2=df2.drop(columns['Chinese'])
df2=df2.drop(index=['ZhangFei'])
#列columns,行index

2.2 重命名列名columns,让列表名更容易识别
如果你想对DataFrame中的columns进行重命名,可以直接使用rename(columns=new_names, inplace=True) 函数,比如我把列名Chinese改成YuWen,English改成YingYu。

df2.rename(columns={'Chinese':'YuWen','English':'YingYu'},inplace=True)

2.3 去重复的值
数据采集可能存在重复的行,这时只要使用drop_duplicates()就会自动把重复的行去掉。

df=df.drop_duplicates()#去除重复行

2.4 格式问题

#更改数据格式,很多时候数据格式不规范,可以使用astype函数来规范数据格式,比如我们把Chinese字段的值改成str类型,或者int64可以这么写:
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
#数据间的空格:有时候我们先把格式转成了str类型,是为了方便对数据进行操作,这时想要删除数据间的空格,我们就可以使用strip函数:
#删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
#删除左边空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
#删除右边空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
#数据中有特殊符号,需要删除时
df2['Chinese']=df2['Chinese'].str.strip('$')#Chinese字段里有美元符号,需要删除
#大小写转换是个比较常见的操作,比如人名、城市名等的统一都可能用到大小写的转换,在Python里直接使用upper(), lower(), title()函数,方法如下:
#全部大写
df2.columns = df2.columns.str.upper()
#全部小写
df2.columns = df2.columns.str.lower()
#首字母大写
df2.columns = df2.columns.str.title()
#查找空值 数据量大的情况下,有些字段存在空值NaN的可能,这时就需要使用Pandas中的isnull函数进行查找
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [None,98, 96, 77,90]}
df3 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print(df3)
            English  Math  Chinese
ZhangFei         65    NaN      66
GuanYu           85    98       95
ZhaoYun          92    96       93
HuangZhong       88    77       90
DianWei          90    90       80
#要看那个地方存在空值,可以针对数据表进行操作
df3.isnull()
            English  Math  Chinese
ZhangFei     False   True   False
GuanYu       False   False  False
ZhaoYun      False   False  False
HuangZhong   False   False  False
DianWei      False   False  False
#哪列存在空值
df3.isnull().any()
English    False
Math        True
Chinese    False
dtype: bool

2.5 使用apply函数对数据进行清洗
apply函数是Pandas中自由度非常高的函数,使用频率也非常高

#比如对name列的数值转换为大写
df2['name'] = df2['name'].apply(str.upper)
#也可以定义个函数,在apply中使用,比如定义double_df函数是将原来的数值*2进行返回。
def double_df(x):
           return 2*x
df2[u'语文'] = df2[u'语文'].apply(double_df)
#还可以定义更复杂的函数
#新增两列,其中new1列是语文与英语成绩之和的m倍,new2列是语文和英语成绩之和的n倍
def plus(df2,n,m):
    df2['new1'] = (df2[u'语文']+df2[u'英语']) * m
    df2['new2'] = (df2[u'语文']+df2[u'英语']) * n
    return df2
df2 = df2.apply(plus,axis=1,args=(2,3,))
#axis=1代表按照列为轴进行操作,axis=0代表按照行为轴进行操作

2.6 数据统计
Pandas和NumPy一样,都有常用的统计函数,如果遇到空值NaN,会自动排除。
在这里插入图片描述

#拿describe()函数举例
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print(df1.describe())
          data1
count  5.000000
mean   2.000000
std    1.581139
min    0.000000
25%    1.000000
50%    2.000000
75%    3.000000
max    4.000000

2.7数据表合并
有时候我们需要将多个渠道源的多个数据表进行合并,一个DataFrame相当于一个数据库的数据表,那么多个DataFrame数据表的合并就相当于多个数据库的表合并。

#比如创建两个DataFrame
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
#两个DataFrame数据表的合并使用的是merge()函数,有下列5中形式:
#1.基于指定列进行连接
df4=pd.merge(df1,df2,on='name')
     name  data1  data2
0  ZhangFei      0      0
1    GuanYu      1      1
#2.inner内连接,inner内链接是merge合并的默认情况,inner内连接其实也就是键的交集。
df5=pd.merge(df1,df2,how='inner')
       name  data1  data2
0  ZhangFei      0      0
1    GuanYu      1      1
#3.left左连接 左连接是以第一个DataFrame为主进行的连接,第二个DataFrame作为补充。
df6 = pd.merge(df1, df2, how='left')
       name  data1  data2
0  ZhangFei      0    0.0
1    GuanYu      1    1.0
2         a      2    NaN
3         b      3    NaN
4         c      4    NaN
#4.right右连接 右连接是以第二个DataFrame为主进行的连接,第一个DataFrame作为补充。
df7 = pd.merge(df1, df2, how='right')
       name  data1  data2
0  ZhangFei    0.0      0
1    GuanYu    1.0      1
2         A    NaN      2
3         B    NaN      3
4         C    NaN      4
#5.outer外连接 外连接相当于求两个DataFrame的并集。
df3 = pd.merge(df1, df2, how='outer')
       name  data1  data2
0  ZhangFei    0.0    0.0
1    GuanYu    1.0    1.0
2         a    2.0    NaN
3         b    3.0    NaN
4         c    4.0    NaN
5         A    NaN    2.0
6         B    NaN    3.0
7         C    NaN    4.0

3.如何用SQL方式打开Pandas
Pandas的DataFrame数据类型可以让我们像处理数据表一样进行操作,比如数据表的增删改查,都可以用Pandas工具来完成。不过也会有很多人记不住这些Pandas的命令,相比之下还是用SQL语句更熟练,用SQL对数据表进行操作是最方便的,它的语句描述形式更接近我们的自然语言。
事实上,在Python里可以直接使用SQL语句来操作Pandas。------pandasql
pandasql 中的主要函数是 sqldf,它接收两个参数:一个SQL 查询语句,还有一组环境变量globals()或locals()。这样我们就可以在Python里,直接用SQL语句中对DataFrame进行操作,

import pandas as pd
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
#对张飞行进行输出
print (pysqldf(sql))
data1      name
0      0  ZhangFei
#lambda 是用来定义一个匿名函数的
lambda argument_list:expression
#argument_list是参数列表,expression是关于参数的表达式,会根据expression表达式计算结果进行输出返回。
pysqldf = lambda sql: sqldf(sql, globals())
#输入参数是sql,返回结果是sqldf对sql的运行结果,sqldf中也输入了globals全局参数,因为在sql中有对全局参数df1的使用。

总结
在这里插入图片描述
练习
对于下表的数据,请使用Pandas中的DataFrame进行创建,并对数据进行清洗。同时新增一列“总和”计算每个人的三科成绩之和。
在这里插入图片描述

import pandas a pd
from pd import Series,DataFrame

data = {'语文': [66, 95, 95, 90,8080],'英语': [65, 85, 92, 88, 90, 90],'数学': [None, 98, 96, 77, 90,90]}
df = DataFrame(data, index=['张飞', '关羽', '赵云', '黄忠', '典韦','典韦'], columns=['语文', '英语', '数学'])
print(df)
#去重
df=df.drop_duplicates()
#填充缺失值,在这里建议用平均值
df['数学'].fillna(df['数学'].mean().astype(int),inplace=True)
#新增
def plus(df,n,m):
    df['总和'] = df[u'语文']+df[u'英语']+df[u'数学']
    return df
df = df.apply(plus,axis=1)
print(df)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值