pandas知识小结

"""

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
"""







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值