赞
踩
在数据分析中,Pandas是非常重要的一个库,一方面是因为pandas提供的数据结构DataFrame与json的契合度高,转化起来很方便,另一面,如果我们日常的数据清理工作不是很复杂,只要几行Pandas的代码就可以对数据进行规整。pandas的API文档在此
Pandas 中的两个核心数据结构:Series和DataFrame,它们分别代表着一维序列和二维的表结构。
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很像我们的数据库的表,或者说是我们的电子表,它包括了行索引和列索引,看成是由相同索引的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)
可以使用pandas的drop()方法来删除我们不想要的行或者列,如,我们想要删除语文这一列:
df = df.drop(columns=['语文'])
删除张飞这一行:
df = df.drop(index=['张飞'])
使用rename(columns=new_name, inplace = True)函数,比如我要把数学改成数理
df.rename(columns={'数学': '数理'}, inplace = True)
数据采集可能存在重复的行,这时只要使用drop_duplicates()就会自动把重复的行去掉。
df=df.drop_duplicates()#直接去重
有时候,我们的数据表中可能会有一些空缺的数据项,我们可以选择直接丢弃掉这些数据,或者使用我们想要的数据进行填充。如果我们要直接丢掉这些空缺的数据,可以使用pandas的dropna方法去掉。
df = df.dropna()# 直接把空的数据掉,清洗为空的数据
或者指定我们想要的值,使用pandas的fillna()方法进行填充
df.fillna("填补上的数据", inplace=True)
df.fillna(df["数学"].mean(), inplace=True)# 使用其他学生的平均值对空值进行填充,df["数学"].mean()为其他学生平均值
更改数据格式:
这是个比较常用的操作,因为很多时候数据格式不规范,我们可以使用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函数是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做数据挖掘才具有优势。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。