series --一维结构(了解)
dataframe —二维结构(重点)
pannel —三维结构–面板结构(知道)
文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件。
csv 是一种逗号分隔的文件格式,因为其分隔符不一定是逗号,又被称为字符分隔文件,文件以
纯文本形式存储表格数据(数字和文本)。
读取方式:
使用read_table
函数来读取csv文件
pandas.read_table(filepath_or_buffer, sep=’\t’, header=’infer’, names=None,
index_col=None, dtype=None, engine=None, nrows=None)
使用read_csv
函数来读取csv文件
pandas.read_csv(filepath_or_buffer, sep=’\t’, header=’infer’, names=None,
index_col=None, dtype=None, engine=None, nrows=None)
read_table和read_csv函数中的
sep参数
是指定文本的分隔符的,如果分隔符指定错误,在读 取数据的时候,每一行数据将连成一片。
header
参数是用来指定列名的,如果是None则会添加一个默认的列名。
encoding
代表文件的编码格式,常用的编码有utf-8、utf-16、 、gb2312、gb18030等。
如果编码指定错误数据将无法读取,IPython解释器会报解析错误。
文本文件的存储和读取类似,结构化数据可以通过pandas中的to_csv
函数实现以csv文件格式存储文件:
DataFrame.to_csv( , sep=’,’, na_rep=”, columns=None, header=True,
index=True,index_label=None,mode=’w’,encoding=None)
pandas提供了read_excel函数来读取“xls”“xlsx”两种Excel文件。
pandas.read_excel(io, sheetname=0, header=0,
index_col=None, names=None, dtype=None)
将文件存储为Excel文件,可以使用to_excel
方法。其语法格式如下。
DataFrame.to_excel( , sheet_name='None', na_rep=”, header=True,
index=True, index_label=None, mode=’w’, encoding=None)
和to_csv方法的常用参数基本一致,区别之处在于指定存储文件的文件路径参数名称为excel_writer,并且 没有sep
参数, ,默认为sheet1。
对单列数据的访问:DataFrame的单列数据为一个Series。
根据DataFrame的定义可以知晓DataFrame 是一个带有标签的二维数组,每个标签相当每一列的列名。有以下两种方式来实现对单列数据的访问。
(1)
以字典访问某一个key的值的方式使用对应的列名,实现单列数据的访问。
(2)
以属性的方式访问,实现单列数据的访问。(不建议使用,易引起混淆)
对某一列的某几行访问:访问DataFrame中某一列的某几行时,单独一列的DataFrame可以视为一个 Series(另一种pandas提供的类,可以看作是只有一列的DataFrame),而访问一个Series基本和访问
一个一维的ndarray相同。
对多列数据访问:访问DataFrame多列数据可以将多个列索引名称视为一个列表,同时访问DataFrame
多列数据中的多行数据和访问单列数据的多行数据方法基本相同。
loc
方法是针对DataFrame索引名称
的切片方法,如果传入的不是索引名称,那么切片操作将无法执行。 利用loc方法,能够实现所有单层索引切片操作。loc方法使用方法如下。
DataFrame.loc[行索引名称或条件, 列索引名称]
iloc和loc区别是iloc接收的必须是行索引和列索引的位置。iloc
方法的使用方法如下。
DataFrame.iloc[行索引位置, 列索引位置]
使用loc方法和iloc实现多列切片
:其原理的通俗解释就是将多列的列名或者位置作为一个列表或者数据传 入。
使用loc,iloc方法可以取出DataFrame中的任意数据。
在loc使用的时候内部传入的行索引名称如果为一个区间,则前后均为闭区间;
iloc方法使用时内部传入的行索引位置或列索引位置为区间时,则为前闭后开区间。
loc内部还可以传入表达式,结果会返回满足表达式的所有值。
loc更加灵活多变,代码的可读性更高,iloc的代码简洁,但可读性不高。
具体在数据分析工作中使用哪一 种方法,根据情况而定,大多数时候建议使用loc方法
ix
方法更像是loc
和iloc
两种切片方法的融合。
ix
方法在使用时既可以接收索引名称也可以接收索引位置。 其使用方法如下:
DataFrame.ix[行索引的名称或位置或者条件, 列索引名称或位置]
使用ix
方法时有个注意事项:当索引名称和位置存在部分重叠时,ix
默认优先识别名称。
控制ix方法需要注意以下几点:
(1)使用ix参数时,尽量保持行索引名称和行索引位置重叠,使用时就无须考虑取值时区间的问题。一律为闭区间。
(2)使用列索引名称,而非列索引位置。主要用来保证代码可读性。
(3)使用列索引位置时,需要注解。同样保证代码可读性。
(4)除此之外
ix
方法还有一个缺点,就是在面对数据量巨大的任务的时候,其效率会低于loc
和iloc
方法,所以在日常的数据分析工作中建议使用loc
和iloc
方法来执行切片操作
更改DataFrame中的数据,原理是将这部分数据提取出来,重新赋值为新的数据。
需要注意的是,数据更改直接针对DataFrame原数据更改,操作无法撤销,如果做出更改,需要对更改条件做确认或对数据进行备份。
DataFrame添加一列的方法非常简单,只需要新建一个列索引。并对该索引下的数据进行赋值操作即可。 新增的一列值是相同的则直接赋值一个常量即可。
删除某列或某行数据需要用到pandas提供的方法drop
,drop方法的用法如下:
(1)axis为0时表示删除行,axis为1时表示删除列。
drop(labels, axis=0, level=None, inplace=False, errors='raise')
数值型数据的描述性统计主要包括了计算数值型数据的完整情况、最小值、均值、中位数、最大值、四分 位数、极差、标准差、方差、协方差和变异系数等。
在NumPy库中一些常用的统计学函数如下表所示。
pandas库基于NumPy,自然也可以用这些函数对数据框进行描述性统计。
pandas还提供了更加便利的方法来计算均值 ,如 :
detail['amounts'].mean()
pandas还提供了一个方法叫作 describe
,能够一次性得出数据框所有数值型特征的非空值数目、均值、
四分位数、标准差。
detail[['counts','amounts']].describe()
描述类别型特征的分布状况,可以使用频数统计表。pandas库中实现频数统计的方法为value_counts
。
pandas提供了categories
类,可以使用astype
方法将目标特征的数据类型转换为category
类别。
describe方法除了支持传统数值型以外,还能够支持对category类型的数据进行描述性统计,四个统计
量分别为列非空元素的数目,类别的数目,数目最多的类别,数目最多类别的数目。
在多数情况下,对时间类型数据进行分析的前提就是将原本为字符串的时间转换为标准时间类型。
pandas继承了NumPy库和datetime库的时间相关模块,提供了6种时间相关的类。
示例1:DataFrame属性认识:
import pandas as pd
import numpy as np
#加载数据
data = np.load("./国民经济核算季度数据.npz")
columns = data['columns']
values = data['values']
index =["index_"+ str(i) for i in range(values.shape[0])]
# 生成df
df = pd.DataFrame(values,columns=columns,index=index)
df = pd.DataFrame(values)
print("df:\n",df)
# print("df类型:\n",type(df))
print("*"*80)
#ndarray 属性:ndim shape dtype itemsize size
# print("df的ndim:\n",df.ndim)
# print("df的shape:\n",df.shape)
print("df的dtypes:\n",df.dtypes) # 没有dtype,但是有dtypes,每一列的数据类型都给你打印出来
# print("df的itemsize:\n",df.itemsize) # df没有这个属性
# print("df的size:\n",df.size)
print("df 的values:\n",df.values)
print("df values 的类型:\n",type(df.values))
# print("df的index:\n",df.index) # 行索引名称
# print("df的columns:\n",df.columns) # 列索引名称
示例2:pandas基本结构:
import numpy as np
import pandas as pd
#加载数据
data = np.load("./国民经济核算季度数据.npz")
columns = data['columns']
values = data['values']
# print(columns)
# print(values)
# 数组拼接
# new_arr = np.concatenate(([columns],values),axis=0)
# print("new_arr:\n",new_arr)
#pandas主要用来进行数据处理
# numpy 科学计算
# matplotlib 数据可视化
# pandas结构核心
# series --一维结构(了解)
# dataframe ---二维结构(重点)
# pannel ---三维结构--面板结构(知道)
# 如何去生成一个df ,看df与数组之间的区别?
# 可以通过 columns 来指定对应的列名称
# 可以通过index 来指定行名称
# index =["index_"+ str(i) for i in range(values.shape[0])]
# df = pd.DataFrame(values,columns=columns,index=index)
# print("df:\n",df)
# print("df类型:\n",type(df))
# df 相比于数组 多了 行索引 与 列索引
# ser = df['时间']
# print("ser:\n",ser)
# print(type(ser))
# 只有一列数据的df 就是series,series只有行索引,没有列索引
#
# df = pd.DataFrame([[1,2,3],[4,5,6],[1,2,6],[4,5,8]],columns=["h","g",'i'])
# print("df:\n",df)
#
# df = df.set_index(['h','g'])
# # df = df.reset_index(['h','g'])
#
# print("*"*80)
#
# print("df:\n",df)
# print(df.index) # pannel类似于MultiIndex结构
示例3:pandas文件读取与存储:
import pandas as pd
#numpy 文件存储与读取 save,savez,savetxt---load,loadtxt,genfromtxt
# excel 其实就是表格文件,以.xlsx xls结尾的文件
# 文件文件
# 读取csv文件
# info = pd.read_csv("./meal_order_info.csv",encoding='ansi')
# print(info)
# sep 分隔符,必须指定
# info = pd.read_table("./meal_order_info.csv",sep=',',encoding='ansi')
# print(info)
# print(type(info))
# detail = pd.read_excel("./meal_order_detail.xlsx")
# print(detail)
users = pd.read_excel("./users.xlsx")
# print(users)
# 读取 pd.read_xxx 读出来
# 保存 df.to_xxxx保存起来
# users.to_excle()
# users.to_csv()
users.to_excel()
示例4:DataFrame查询操作:
#访问df数据 ---查
import pandas as pd
# 直接索引方式
# 加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
# print("detail :\n",detail)
print("detail 的形状:\n",detail.shape)
print("detail 的列名称:\n",detail.columns)
print("detail 的类型:\n",type(detail))
# print("detail 的index:\n",detail.index)
index = ['index_'+str(i) for i in range(detail.shape[0])]
detail.index=index
print("*"*80)
print("detail 的index:\n",detail.index)
print(detail.iloc[3,4])
# print(detail[3:5])
# print(detail.loc[detail.index[2:5],'detail_id':'dishes_id'])
# 我想获取order_id这一列数据
# print(detail.loc[:,'detail_id']>0)
# print(detail.loc[detail.loc[:,'detail_id']>0])
# order_id = detail['order_id']
# print("order_id:\n",order_id)
# print("order_id 的类型:\n",type(order_id))
# 获取多列呢? --将多列名称组成一个列表
# new_detail = detail[['order_id','dishes_id','dishes_name']]
# print("new_detail:\n",new_detail)
# 获取单列的前 5行---可以通过切片,也可以通过head()方法
# order_id = detail['order_id'][:5]
# print("order_id:\n",order_id)
# print("order_id 的类型:\n",type(order_id))
# order_id = detail['order_id'].head(10) # head()获取前N行
# print("order_id:\n",order_id)
# print("order_id 的类型:\n",type(order_id))
# 获取单列的后 5行-
# order_id = detail['order_id'][-5:]
# print("order_id:\n",order_id)
# print("order_id 的类型:\n",type(order_id))
# order_id = detail['order_id'].tail() # tail默认获取后5行
# print("order_id:\n",order_id)
# print("order_id 的类型:\n",type(order_id))
# 获取多列的 多行,只能通过切片
# new_detail = detail[['order_id','dishes_id','dishes_name']][1024:1027]
# print("new_detail:\n",new_detail)
# print("new_detail的类型:\n",type(new_detail))
# 获取单列的指定多行---指定行名称为 0,1024,2019的这三行
# order_id = detail['order_id'][["index_0","index_1024",'index_2019']]
# print("order_id:\n",order_id)
# print("order_id 的类型:\n",type(order_id))
# arr[hang,lie]
# df[lie][hang] df 进行数据访问,必须先切列,在切行,不是同时索引
# 列名称可以切片,行名称也可以进行切片,而且是包含边界值
# loc,iloc,ix
# loc --->df.loc[行名称,列名称]
# 获取多列,指定行内容
# new_deatil = detail.loc[["index_0","index_1024",'index_2019'],['order_id','dishes_id','dishes_name']]
#
# print("new_detail:\n",new_deatil)
# print(type(new_deatil))
# loc里面只能是 行名称、列名称
# new_deatil = detail.loc[["index_0","index_1024",'index_2019'],[1,2,5]] # 错误的
# iloc[行下标,列下标] ---只能接收下标,不能接收名称
# new_deatil = detail.iloc[["index_0","index_1024",'index_2019'],['order_id','dishes_id','dishes_name']] # 错误的
# new_deatil = detail.iloc[[0,1024,2019],[1,2,5]]
# print("new_detail:\n",new_deatil)
# print(type(new_deatil))
# 我只需要 行名称为 x,y,z 的这三行 里面的 a,b,c列 -->df.loc[[x,y,z],[a,b,c]]
# 我只需要 1024-2015行 里面的 a,b,c列 --->df.iloc[1024:2016,[abc列所对应的的列下标]]
# ix ---混合索引,既可以使用下标,又可以使用名称
# new_deatil = detail.ix[1024:2016,'detail_id':'amounts']
# print("new_detail:\n",new_deatil)
# print(type(new_deatil))
# new_deatil = detail.ix["index_1024":"index_2016",'detail_id':'amounts']
# print("new_detail:\n",new_deatil)
# print(type(new_deatil))
# new_deatil = detail.ix["index_1024":2016,'detail_id':8] #错误的
# print("new_detail:\n",new_deatil)
# print(type(new_deatil))
示例5:DataFrame更改操作:
import pandas as pd
import numpy as np
# 加载数据
users = pd.read_excel("./users.xlsx")
print("users:\n",users)
print("users的形状:\n",users.shape)
print("users的数据类型:\n",users.dtypes)
# 将 name 这一列 全部改为 "少侠"
# 将name 这一列拿出来
# name = users['NAME']
# name = users.loc[:,'NAME']
# print("name:\n",name)
# users.loc[:,'NAME'] = "少侠"
# print(users)
# 将 sex这列 不为女性 都给改成女性
# users.loc[:,'sex'] = '女性'
# 将 sex这列 NAN 的 给改成女性
# users.loc[1,'sex'] = '女性'
# print("users:\n",users)
# 将 sex这列 男性 的 给改成女性
# 首先 获取到sex 这一列,然后判断,哪些 行 不是女,然后 在进行更改
# # np.nan --缺失值
# bool_id = users.loc[:,'sex'] != '女'
# print(bool_id)
#
# # bool数组进行索引
# users.loc[bool_id,'sex'] ='女'
#
# print(users)
# 将年龄都是偶数的统统改成0
# bool_id = users.loc[:,'age'] % 2 == 0
#
# users.loc[bool_id,'age'] = 0
#
# print(users)
示例6:DataFrame增加与删除操作:
import pandas as pd
# 加载数据
users = pd.read_excel("./users.xlsx")
print("users:\n",users)
print("users的形状:\n",users.shape)
print("users的数据类型:\n",users.dtypes)
# # age---随着时间不断变大
# # 增加一列 next_year_age
# users.loc[:,'next_year_age'] = users.loc[:,'age'] + 1
#
# # print(users)
#
# # 增加一列 '国籍'
# users.loc[:,'nation'] = 'China'
#
# print(users)
# 删除---drop
# 删除单列
# labels --名称
# axis ---轴
# users.drop(labels='age',axis=1,inplace=True)
# print(users.shape)
# 删除多列
# users.drop(labels=['age','sex','qq'],axis=1,inplace=True)
# users.drop(labels=[0,1],axis=1,inplace=True) # 错误的
# print(users.shape)
# 删除多行--指定行名称
# users.drop(labels=[0,1,2,3,4,5],axis=0,inplace=True)
# print(users.shape)
示例7:pandas统计分析:
import pandas as pd
#加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
print(detail)
print("detail 的列索引:\n",detail.columns)
print("detail 数据类型:\n",detail.dtypes)
# numpy 统计分析 max min mean std var argmax argmin cumprod cumsum ....
# np.指标(arr,axis)
# arr.指标(axis)
#df ---针对每一列进行统计分析
# 针对于数值型的统计分析---常规统计
# print("amounts 的sum",detail['amounts'].sum())
# print("amounts 的max",detail['amounts'].max())
# print("amounts 的min",detail['amounts'].min())
# print("amounts 的var",detail['amounts'].var())
# print("amounts 的std",detail['amounts'].std())
# print("amounts 的mean",detail['amounts'].mean())
# print("amounts 的ptp",detail['amounts'].ptp())
# print("amounts 的median",detail['amounts'].median())
# print("amounts 众数",detail['amounts'].mode()) # 返回众数数组[35],---下标,值
# print("amounts 最大值下标",detail['amounts'].idxmax())
# print("amounts 最小值的下标",detail['amounts'].idxmin())
# print("amounts 非空数值的数量",detail['amounts'].count())
# describe()统计--返回8种结果
# print("amounts describe()统计",detail['amounts'].describe())
# describe也可以对非数值型进行统计分析
# print("dishes_name的describe统计分析:\n",detail['dishes_name'].describe())
# 对于amounts统计众数、众数出现的次数、去重之后的结果,
# 常规的统计分析满足不了,describe对于数值型统计也满足不了
# 先将amounts 转化为非数值型,在进行describe统计分析
# print("*"*80)
# 既可以改成obj 这种类型,也可以改成类别型类型
# detail['amounts'] = detail['amounts'].astype('object')
# detail['amounts'] = detail['amounts'].astype('category')
# print("detail 数据类型:\n",detail.dtypes)
#
# print("amounts转化类型之后的的describe统计分析:\n",detail['amounts'].describe())
示例8:时间序列数据:
import pandas as pd
# pandas 默认时间序列点类型?-----Timestamp
# pandas 默认 时间序列类型?----DatetimeIndex
# numpy默认的时间点类型 datetime64[ns]
# 2019-07-26 ---2019/07/26
# 生成时间类型
# to_datetime/DatetimeIndex可以将时间转化为pandas 默认支持的时间点 或者时间序列
# time_point = pd.to_datetime('2019-07-26')
# print(time_point)
# print(type(time_point))
# # pd.DatetimeIndex()
#
# time_list = pd.to_datetime(['2019-07-26','2019-07-25','2019-07-24','2019-07-23'])
#
# print(time_list)
# print(type(time_list))
# 时间类型的属性
# 加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
# print("detail:\n",detail)
# print("detail的数据类型:\n",detail.dtypes)
print("detail的列名称:\n",detail.columns)
# 拿到下单时间这一列,将它转化为pandas默认支持的时间序列
detail['place_order_time'] = pd.to_datetime(detail.loc[:,'place_order_time'])
# print("detail的数据类型:\n",detail.dtypes)
print("detail里面的 place_order_time:\n",detail['place_order_time'])
# 属性---通过列表推导式来获取属性
year = [i.year for i in detail['place_order_time']]
print(year)
month = [i.month for i in detail['place_order_time']]
print(month)
day = [i.day for i in detail['place_order_time']]
print(day)
quarter = [i.quarter for i in detail['place_order_time']]
print(quarter)
weekday = [i.weekday for i in detail['place_order_time']]
print(weekday)
weekday_name = [i.weekday_name for i in detail['place_order_time']]
print(weekday_name)
is_leap_year = [i.is_leap_year for i in detail['place_order_time']]
print(is_leap_year)
# 能够进行时间相加 相减
detail['ok_order_time'] =detail['place_order_time'] + pd.Timedelta(days=1) + pd.Timedelta(hours=1)
# detail['ok_order_time'] =detail['place_order_time'] + pd.Timedelta(hours=1)
# detail['ok_order_time'] =detail['place_order_time'] + pd.Timedelta(weeks=1)
# detail['ok_order_time'] =detail['place_order_time'] - pd.Timedelta(weeks=1)
# print(detail[['place_order_time','ok_order_time']])
# 也能查看现在距离过去,经过了多久
# detail['distance'] = detail['ok_order_time'] -detail['place_order_time']
#
# print(detail[['place_order_time','ok_order_time','distance']])
# 查看自己电脑的时间的使用期限
# print("最早时间:",pd.Timestamp.min)
# print("最晚时间:",pd.Timestamp.max)