"""
Pandas基本介绍—Python Data Analysis Library 或 Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
"""
#导入
import pandas as pd
import numpy as np
#pandas数据结构
"""
一维数组Series
类Numpy的一维数组array,二者与Python基本的数据结构List也很接近。Series**能保存不同种数据类型**,字符串、boolean值、数字等都能保存在Series中。
二维表格型dataFrame
二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
"""
s = pd.Series([1,3,5,np.nan,6,8],index = ['a','b','c','d','x','y'])
index设置索引,不设置的话在输出时会在值左侧默认生成0,1,2等索引,np.nan设置空值
#索引-数据的行标签
s.index #查看索引 RangeIndex(start=0, stop=6, step=1) [0,6),步长1
s.values #查看值 array([ 1., 3., 5., nan, 6., 8.])
s[3] #针对查询
s[2:5] #切片 左闭右开
s[::2] #基本操作与python语法相同
s.index.name = '索引' #设置索引的名字,会在索引那一列上面生成一个名字
s.index = list('abcdef') #会更改索引的值,使用list中每个字母作为一个索引
s['a':'c':2] #依据定义的索引切片
Pandas库的DataFrame类型
date = pd.date_range("20180101", periods = 6) #构造一组时间序列,作为第一维的
#下标,这里20180101是时间起点,periods是6个值
df = pd.DataFrame(np.random.randn(6,4), index = date, columns = list("ABCD")) #使用了date作为行名,列名用columns定义,用随机数根据形状产生值,默认是0开始产生索引
df2 = pd.DataFrame({'A':1.,'B':pd.Timestamp("20181001"),'C':pd.Series(1,index = list(range(4)),dtype = float),'D':np.array([3]*4, dtype =int),'E':pd.Categorical(["test","train","test","train"]),'F':"abc"}) #B:时间戳,E分类类型
df2.dtypes #查看各个列的数据类型
#字典的每个key代表一列,其value可以是各种能够转化为Series的对象。
#与Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同。
查看数据
df.head() #查看头部几行数据(默认5)
df.tail(3) #尾部数据(括号的数字指定几行)
df.index #查看行标
df.columns #查看列标
df.values #查看值,和Series的用法一样
#pandas的数据读取保存和数据操作
df = pd.read_excel(r"./豆瓣电影数据.xlsx",index_col = 0) #读取csv:read_csv;绝对路径或相对路径默认在当前文件夹下。r告诉编译器不需要转义
df.to_excel("movie_data.xlsx") #默认路径为现在文件夹所在的路径
#pandas的行操作
df.iloc[0] #查看第一行
df.iloc[0:5] #左闭右开
df.loc[0:5] #不是左闭右开,都是闭
dit = {"名字":"复仇者联盟3","投票人数":123456,"类型":"剧情/科幻"。。。}
s = pd.Series(dit)
s.name = 38738 #先写个字典,用series转换成一维数组,添加name列名
df = df.append(s) #在已有数据上添加
df = df.drop([38738]) #根据列名删除列
#pandas 列操作
df["名字"][:5] #查看"名字"这列前5个数据
df[["名字","类型"]][:5] #查看"名字","类型"这两列前5个数据
df["序号"] = range(1,len(df)+1) #生成序号的基本方式,直接增加序号一列
df = df.drop("序号",axis = 1,inplace=True) #删除列,axis指定方向,0为行1为列,默认为0,是否代替原始数据
df.loc[[index],[column]] #通过标签选择数据,指定某行index,某列column
df.loc[[1,3,5,7,9],["名字","评分"]] #多行跳行多列跳列选择
#pandas条件选择
df[df["产地"] == "美国"][:5] #df["产地"] == "美国"]得到的是一个bool数组,重新使用df会读取true的部分也就是符合条件的,后面加索引可指定切片
df[((df.产地 == "美国") | (df.产地 == "中国大陆")) & (df.评分> 9)][:5] #多重条件
#pandas缺失值及异常值处理
df[df["名字"].isnull()].loc[:10] #isnull返回一个布尔值对象,判断哪些值是缺失值
df[df["名字"].notnull()][:5] #isnull的否定式
df["评分"].fillna(np.mean(df["评分"]), inplace = True)#对缺失值进行填充,这里使用均值来进行替代,inplace意为直接在原始数据中进行修改
df.dropna() 参数 例df.dropna(how = 'all',inplace = True,axis = 0)
how = 'all':删除全为空值的行或列
inplace = True: 覆盖之前的数据
axis = 0: 选择行或列,默认是行 #根据标签中的缺失值进行过滤,删除缺失值
#数据格式转换
"""
在做数据分析的时候,原始数据往往会因为各种各样的原因产生各种数据格式的问题。
数据格式是我们非常需要注意的一点,数据格式错误往往会造成很严重的后果。
并且,很多异常值也是我们经过格式转换后才会发现,对我们规整数据,清洗数据有着重要的作用。
"""
df["投票人数"].dtype #查看格式
df["投票人数"] = df["投票人数"].astype("int") #转换格式
df["年代"] = df["年代"].astype("int") #有异常值会报错
根据异常 invalid literal for int() with base 10: '2008\u200e'
df[df.年代 == "2008\u200e"] #找到异常数据
#排序
df[:10] #默认排序
df.sort_values(by = "投票人数", ascending = False)[:5] #按照投票人数进行排序,ascending表示升序,这里False也就是降序descending,by用来指定列,by = ["评分","投票人数"],列表中的顺序决定先后顺序
#基本统计分析
#(1)描述性统计
df.describe() #统计内容包括每列下的count总数,mean均值,std标准差,min,max,25%,50%,75%等数据
通过描述性统计,可以发现一些异常值,很多异常值往往是需要我们逐步去发现的。
df.drop(df[df["年代"] > 2018].index, inplace = True)
df.drop(df[df["时长"] > 1000].index, inplace = True)#在获取数据异常的行时使用drop在原始数据中删除这行数据
df.index = range(len(df)) #解决删除后索引不连续的问题
#(2)最值
df["年代"].min()
#(3)均值和中值
df["投票人数"].mean() #均值
df["投票人数"].median() #中位数
#(4)方差和标准差
df["评分"].var() #方差
df["评分"].std() #标准差
#(5)求和
df["投票人数"].sum()
#(6)相关系数和协方差
df[["投票人数", "评分"]].corr() #相关系数
1.正值:表示两个变量之间正向关联,即一个变量增加时,另一个也倾向于增加。
2.负值:表示负相关,一个变量增加时,另一个减少。
3.接近1或-1:表示强烈的线性关系,接近0则表示关系较弱或不存在。
df[["投票人数", "评分"]].cov() #协方差-在概率论和统计学中衡量两个变量的总体误差 计算公式COV(X,Y)=E(X,Y)-E(X)*E(Y) 结果判断:
1.如果两项趋于反向变动,则协方差为负
2.如果两项趋于同向变动,则协方差为正
3.变动互不相干,则为零
#(7)计数
len(df) #计数行数量
df["产地"].unique() #会返回产地这一列出现过的值,相同的只会返回一次
df["年代"].value_counts(ascending = True)[:10] #value_counts函数会计算当前列每种元素出现的次数,数据输出结果(左侧元素类别,右侧次数),默认出现频率从大到小
2018 1
1890 1
1892 1
#(8)去重复
df["产地"].replace("USA","美国",inplace = True) #第一个参数是要替换的值,第二个参数是替换后的值
df["产地"].replace(["西德","苏联"],["德国","俄罗斯"], inplace = True) #注意一一对应
#数据透视
"""
Excel中数据透视表的使用非常广泛,其实Pandas也提供了一个类似的功能,名为pivot_table。
pivot_table非常有用,我们将重点解释pandas中的函数pivot_tabl_table。
使用pandas中的pivot_table的一个挑战是,你需要确保你理解你的数据,并清楚地知道你想通过透视表解决什么问题。虽然pivot_table看起来只是一个简单的函数,但是它能够快速地对数据进行强大的分析。
"""
#(1)基础形式
pd.set_option("display.max_columns",100) #设置可展示的行和列,让数据进行完整展示
pd.set_option("display.max_rows",500)
pd.pivot_table(df, index = ["年代"]) #统计各个年代中所有数值型数据
#(2)也可以有多个索引。实际上,大多数的pivot_table参数可以通过列表获取多个值。
pd.pivot_table(df, index = ["年代", "产地"]) #双索引,这里就是对每个年代的不同产地进行统计,默认会统计所有列是int或者float这类数据格式的数据
#(3)也可以指定需要统计汇总的数据
pd.pivot_table(df, index = ["年代", "产地"], values = ["评分"]) #这里指定了统计评分这一类数据
#(4)还可以指定函数,来统计不同的统计值
pd.pivot_table(df, index = ["年代", "产地"], values = ["投票人数"], aggfunc = np.sum)
#aggfunc = np.sum 这里指定了func函数为numpy的求和函数
pd.pivot_table(df, index = ["产地"], values = ["投票人数", "评分"], aggfunc = [np.sum, np.mean]) #通过将“投票人数”列和“评分”列进行对应分组,对“产地”实现数据聚合和总结。
"""
sum mean
投票人数 评分 投票人数 评分
产地
中国台湾 5237466 1 2 3
"""
#(5)非数值(NaN)难以处理。如果想移除它们,可以使用“fill_value”将其设置为0
pd.pivot_table(df, index = ["产地"], aggfunc = [np.sum, np.mean], fill_value = 0)
#(6)加入margins = True,可以在下方显示一些总和数据。
pd.pivot_table(df, index = ["产地"], aggfunc = [np.sum, np.mean], fill_value = 0, margins = True)
"""
韩国 2694871 8759930 134225 8523.200000 2008.100596
All 76206345 239233853 3393967 264149.735704 1996.
"""
#(7)对不同值执行不同的函数:可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加整洁才行。
pd.pivot_table(df, index = ["产地"], values = ["投票人数", "评分"], aggfunc = {"投票人数":np.sum, "评分":np.mean},fill_value = 0)
#(8)多个索引汇总
pd.pivot_table(df, index = ["产地", "年代"], values = {"投票人数":np.sum, "评分":np.mean}, fill_value = 0)
"""
投票人数 评分
产地 年代
中国台湾 1963 121 6.400000
1965 461 6.800000
1966 51 7.900000
... ... ... ...
韩国 2012 610317 6.035238
2013 1130800 6.062037
"""
pandas知识小结
最新推荐文章于 2024-09-26 11:55:47 发布