python的科学计算库:Pandas

在数据分析中,Pandas是非常重要的一个库,一方面是因为pandas提供的数据结构DataFrame与json的契合度高,转化起来很方便,另一面,如果我们日常的数据清理工作不是很复杂,只要几行Pandas的代码就可以对数据进行规整。pandas的API文档在此
Pandas 中的两个核心数据结构:SeriesDataFrame,它们分别代表着一维序列和二维的表结构。

Series

Series是一个定长的字典序列,说是定长是因为在存储的时候,相当于两个ndarray(ndarray为NumPy中的数组对象),这也是和字典结构最大的不同。因为在字典的结构里,元素的个数是不固定的。
Series有两个基本属性:index(索引)和values(数组),在Series中,index默认是0,1,2,3…递增的序列,当然我们也可以自己来指定索引,如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'])#使用index来指定我们想要的索引
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)

也可以对Series进行一些处理,然后,再进行输出:


In [11]: obj2
Out[11]:
d    6
b    7
a   -5
c    3
dtype: int64
 
In [12]: obj2[obj2 > 0]
Out[12]:
d    6
b    7
c    3
dtype: int64
 
In [13]: obj2 * 2
Out[13]:
d    12
b    14
a   -10
c     6
dtype: int64

DataFrame

DataFrame很像我们的数据库的表,或者说是我们的电子表,它包括了行索引和列索引,看成是由相同索引的Series组成的字典类型。
1.程序里自定义数据方式

import pandas
from pandas import Series,DataFrame
#数值
data={"语文":[66,95,95,90,80,80],"英语":[65,85,92,88,90,90],"数学":[None,98,96,77,90,90]}

#行索引
index=["张飞","关羽","赵云","黄忠","典韦","典韦"]

#列名、列索引
columns=["语文","英语","数学"]

#构造一个DataFrame
df=DataFrame(data=data,index=index,columns=columns)
print(df)

#运行输出:
    语文  英语    数学
张飞  66  65   NaN
关羽  95  85  98.0
赵云  95  92  96.0
黄忠  90  88  77.0
典韦  80  90  90.0
典韦  80  90  90.0

2.从外部文件导入,使用pandas的read_excel读取我们的表格文件

import pandas
from pandas import Series,DataFrame
df=DataFrame(pandas.read_excel("test.xlsx"))
print(df)

数据导入和导出

pandas允许直接从xlsx,csv等文件中导入数据,也可以输出到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)

数据清洗

下面是我们要操作的数据:

import pandas
from pandas import Series,DataFrame
#数值
data={"语文":[66,95,95,90,80,80],"英语":[65,85,92,88,90,90],"数学":[None,98,96,77,90,90]}

#行索引
index=["张飞","关羽","赵云","黄忠","典韦","典韦"]

#列名、列索引
columns=["语文","英语","数学"]

#构造一个DataFrame
df=DataFrame(data=data,index=index,columns=columns)

1.删除DataFrame中不必要的列或者行:

可以使用pandas的drop()方法来删除我们不想要的行或者列,如,我们想要删除语文这一列:

df = df.drop(columns=['语文'])

删除张飞这一行:

df = df.drop(index=['张飞'])
2.重命名列名columns,让列名容易记住

使用rename(columns=new_name, inplace = True)函数,比如我要把数学改成数理

df.rename(columns={'数学': '数理'}, inplace = True)
3.去重复的值

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

df=df.drop_duplicates()#直接去重
4.处理空缺数据

有时候,我们的数据表中可能会有一些空缺的数据项,我们可以选择直接丢弃掉这些数据,或者使用我们想要的数据进行填充。如果我们要直接丢掉这些空缺的数据,可以使用pandas的dropna方法去掉。

df = df.dropna()# 直接把空的数据掉,清洗为空的数据

或者指定我们想要的值,使用pandas的fillna()方法进行填充

df.fillna("填补上的数据", inplace=True)

df.fillna(df["数学"].mean(), inplace=True)# 使用其他学生的平均值对空值进行填充,df["数学"].mean()为其他学生平均值
5.数据格式问题

更改数据格式:
这是个比较常用的操作,因为很多时候数据格式不规范,我们可以使用astype函数来规范数据格式,比如我们把“语文”字段的值改成str类型,或者int64可以这么写

df['语文'].astype('str') 
df['语文'].astype(np.int64) 

数据间的空格
有时我们的数据间可能会有好多空格,这时我们可以使用strip函数。

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

如果数据里有一些特殊符号也是我们要删除的呢,同样可以使用strip函数,比如“语文”字段里有美元符号,我们想把这个删掉,可以这么写:

df['语文']=df2['语文'].str.strip('$')

大小写转换
使用 upper(), lower(), title() 函数,如下

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

查找空值
数据量大的情况下,有些字段存在空值NaN的可能,这时就需要使用Pandas中的isnull函数进行查找。

df.isnull()返回结果中就是一些True和False值,False表示的项就是空的。

如果我想知道哪列存在空值,可以使用df.isnull().any()

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

apply函数是pandas中自由度非常高的函数,使用频率也是相当高。
比如我想对name列的数值进行大写转换:

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

另外我们还可以自定义函数,在apply中使用。比如我们想定义一个double_df函数将原来的数值乘以2的再返回,然后我们将语文这一列的数值都应用到这个函数:

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

这样语文这一列的数值都会变为原来的2倍。
我们还可以定义更加复杂的函数,比如我们想增加一列“总分”,就是求前面三科语文、数学、英语的成绩,我们可以这样写:

#定义求和函数
def mysum(df):
    df['总分']=df["语文"]+df["英语"]+df["数学"]
    return df
    
df=df.apply(mysum,axis=1)

其中axis=1代表按照列为轴进行操作,axis=0表示按照行为轴就行操作。比如axis = 1,就会把一行数据作为Series的数据 结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数 会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。
如果我们需要往自定义的函数传参怎么办?可以使用args关键字指定:

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

如上,我们使用args指定了我们的两个参数2和3。

数据统计

在基本是数据清洗后,我们就需要对数据进行统计了。
pandas和numpy一样,都有常用的统计函数,如果遇到空值NaN,会自动排除。
常用的统计函数如下:
count():统计个数,空值NaN不计算
describe():一次性输入多个统计指标,包括count,mean,min,max等
min():最小值
max():最大值
sum():求和
mean():求平均值
median():求中位数
var():求方差
std():求标准差
argmin():统计最小值的索引位置
argmax():统计最大值的索引位置
idxmin():统计最小值的索引值
idxmax():统计最大值的索引值

这里看下describe()这个函数,它集了多个统计函数为一身,是个统计大礼包,可以快速让我们对数据有个全面的了解。下面我直接使用df1.descirbe()输出结果为:

df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
result = df1.describe()
print(result)

结果:

          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
数据表合并

有时候我们会需要将多个表的数据进行合并,一个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.基于指定列进行合并
例如我们基于name这一列进行合并:

import pandas as pd
from pandas import Series,DataFrame
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
df3=pd.merge(df1,df2,on="name")
print(df1)
print("---------")
print(df2)
print("---------")
print(df3)

输出:

   data1      name
0      0  ZhangFei
1      1    GuanYu
2      2         a
3      3         b
4      4         c
---------
   data2      name
0      0  ZhangFei
1      1    GuanYu
2      2         A
3      3         B
4      4         C
---------
   data1      name  data2
0      0  ZhangFei      0
1      1    GuanYu      1

其中前两个data1和data2输出对应的是原始df1和df2。
2 inner内连接:
inner内链接是merge合并的默认情况,inner内连接其实也就是键的交集,在这里df1和df2相同的键是name,所以是基于name字段做的连接:

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

输出:

   data1      name  data2
0      0  ZhangFei      0
1      1    GuanYu      1

3.left左连接
左连接是以第一个DataFrame为主进行的连接,第二个DataFrame作为补充。

df3 = pd.merge(df1, df2, how='left')
print(def3)

输出:

   data1      name  data2
0      0  ZhangFei    0.0
1      1    GuanYu    1.0
2      2         a    NaN
3      3         b    NaN
4      4         c    NaN

可以看到输出中是以df1为主,df2没有对应上的数据则为空NaN
4.right右连接
右连接是以第二个DataFrame为主进行的连接,第一个DataFrame作为补充。

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

输出:

   data1      name  data2
0    0.0  ZhangFei      0
1    1.0    GuanYu      1
2    NaN         A      2
3    NaN         B      3
4    NaN         C      4

可以看到输出中是以df2为主,df1没有对应上的数据则为空NaN。
5.outer外连接
外连接相当于求两个 DataFrame 的并集。

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

输出:

   data1      name  data2
0    0.0  ZhangFei    0.0
1    1.0    GuanYu    1.0
2    2.0         a    NaN
3    3.0         b    NaN
4    4.0         c    NaN
5    NaN         A    2.0
6    NaN         B    3.0
7    NaN         C    4.0

Pandas包与NumPy工具库配合使用可以发挥巨大的威力,正是有了Pandas工具,Python做数据挖掘才具有优势。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值