pyhton pandas快速入门

pandas 入门

pandas是基于numpy结构的含有更高级数据结构和分析能力的工具包。
pandas和核心数据结构是Series和DataFrame两种

数据结构Series 和 DataFrame

Series是一个定长的字典序列。说是定长是因为在储存的时候,相当于两个ndarray,这也是和字典结构最大的不同。
Series有两个基本属性:index和values。在Series中,index默认值是0,1,2…递增的整数,并且我们自己也能指定索引。例如:index=[‘a’,‘b’,‘c’]

import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print x1
print x2

运行结果

0    1
1    2
2    3
3    4
dtype: int64
a    1
b    2
c    3
d    4
dtype: int64

我们也可以使用字典的方式创建Series

d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print x3 

运行结果:

a    1
b    2
c    3
d    4
dtype: int64

DataFrame数据结构

DataFrame相当于一个Excel表格。
我们做一个考试统计表格

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

运行结果:
df1

   Chinese  English  Math
0       66       65    30
1       95       85    98
2       93       92    96
3       90       88    77
4       80       90    90

df2

            English  Math  Chinese
ZhangFei         65    30       66
GuanYu           85    98       95
ZhaoYun          92    96       93
HuangZhong       88    77       90
DianWei          90    90       80

数据导入、导出

pandas可以从xlsx,csv等文件中导入、导出数据。

import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print score

注意:在导入或导出时需要使用xlrd包和openpyxl包,可以直接用pip install来安装

数据清洗

以上文考试成绩为例:

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'])

数据清洗的情况种类:

删除DataFrame中不需要的行和列

drop方法删除,例如:
删除列

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

删除行

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

重命名列名

使用rename重新命名

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

去重复值

drop_duplicates()自动把重复的行去掉

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

格式问题

更改数据格式

我们有时候需要将某个字段的数据类型进行更改。例如:身高 170 我们需要将 170 这个值从str转换为int类型

# 改为str类型
df2['Chinese'].astype('str')
# 改为int类型 
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)

删除特殊符号

有些值里面有特殊符号,我们也需要去除,同样也可以用strip函数。例如:Chinese字段里面有美元符号,我们要删除这个符号:

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

可以直接使用python自带的upper(),lower(),title()函数。

# 全部大写
df2.columns = df2.columns.str.upper()
# 全部小写
df2.columns = df2.columns.str.lower()
# 首字母大写
df2.columns = df2.columns.str.title()

查找空值

我们的数据有时候可能会存在空值。例如:统计月收入时,小孩的月收入为0,我们可能就使用NAN空值替代。
例如:张飞数学为空值

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

结果

   Chinese  English  Math
0       66       65   NaN
1       95       85  98.0
2       93       92  96.0
3       90       88  77.0
4       80       90  90.0
            English  Math  Chinese
ZhangFei         65   NaN       66
GuanYu           85  98.0       95
ZhaoYun          92  96.0       93
HuangZhong       88  77.0       90
DianWei          90  90.0       80

如果我们想看那个地方有空值我们可以使用isnull()函数:

df1.isnull()

结果如下:

   Chinese  English   Math
0    False    False   True
1    False    False  False
2    False    False  False
3    False    False  False
4    False    False  False

想知道那一列存在空值,可以用df1.isnull().any()结果如下:

Chinese    False
English    False
Math        True
dtype: bool

使用apply函数对数据进行清洗

apply函数使用频率很高。
例如,我们想让name列的数据都大写:

df['name'] = df['name'].apply(str.upper)

apply还支持自定义函数方法进行清洗
例如:把语文成绩的数值进行*2处理:

def double_df(x):
           return 2*x
df1[u'语文'] = df1[u'语文'].apply(double_df)

也可以定义复杂的函数。例如:对于DataFrame,新增两列,其中‘new1’列是‘语文’和‘英语’成绩之和的m倍,‘new2’列是‘语文’和‘英语’成绩之和的n倍。

def plus(df,n,m):
    df['new1'] = (df[u'语文']+df[u'英语']) * m
    df['new2'] = (df[u'语文']+df[u'英语']) * n
    return df
df1 = df1.apply(plus,axis=1,args=(2,3,))

axis=1代表按照列为轴进行操作,axis=0代表按照行为轴进行操作,args是传递的两个参数,即,n=2,m=3,在plus函数中使用到了n和m,从而生成新的df
运行结果:

   Chinese  English  Math   new1   new2
0     66.0     65.0   NaN  393.0  262.0
1     95.0     85.0  98.0  540.0  360.0
2     93.0     92.0  96.0  555.0  370.0
3     90.0     88.0  77.0  534.0  356.0
4     80.0     90.0  90.0  510.0  340.0

数据统计

数据统计完之后,要进行数据统计。
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

数据表合并

我们有时需要将两个数据表合并。
创建两个数据表:

df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})

合并数据表使用的是merge()函数,有5种形式

基于指定列进行连接

我们可以基于name这列进行接连

df3 = pd.merge(df1, df2, on='name')

运行结果:

       name  data1  data2
0  ZhangFei      0      0
1    GuanYu      1      1

inner内连接

inner内连接是merge合并的默认情况,inner内连接其实也是键的交集,在这个例子中相同的键是name,所以是基于name字段做的连接:

df3 = pd.merge(df1, df2, how='inner')

运行结果:

       name  data1  data2
0  ZhangFei      0      0
1    GuanYu      1      1

left左连接

左连接是以第一个DataFrame为主进行的连接,第二个DataFram作为补充

df3 = 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

右连接

左连接是以第二个DataFrame为主进行的连接,第一个DataFram作为补充

df3 = 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

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

用SQL方式打开pandas

我们可以使用SQL语句来操作pandas
工具:pandasql,可以用pip install 安装

pandasql中主要函数是sqldf,它接收两个参数:一个SQL查询语句,含有一组环境变量globals()和locals()。这样就可以使用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

上面的例子,是对‘name=‘ZhangFei’’的行进行了输出。
注意:lambda函数是一个匿名函数,具体使用方法:

 lambda argument_list: expression

argument_list是参数列表,expression是关于参数的表达式,会根据expression表达式计算结果进行输出返回
在例子中,我们定义了:

pysqldf = lambda sql: sqldf(sql, globals())

输入的参数是sql,返回的结果是sqldf对sql的运行结果,sqldf中也输入了globals全局参数,因为sql中有对全局参数df1的使用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值