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为主。
一维Series
可以用一维列表初始化:
s = pd.Series([1,3,5,np.nan,6,8])
#index = ['a','b','c','d','x','y'])设置索引,np.nan设置空值
print(s)
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
默认情况下,Series
的下标都是数字(可以使用额外参数指定),类型是统一的。
s.index #从0到6(不含),1为步长
RangeIndex(start=0, stop=6, step=1)
s.values
array([ 1., 3., 5., nan, 6., 8.])
s[3]
nan
切片操作
s[2:5] #左闭右开
2 5.0
3 NaN
4 6.0
dtype: float64
s[::2]
0 1.0
2 5.0
4 6.0
dtype: float64
索引赋值
s.index.name = '索引'
s
索引
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
s.index = list('abcdef')
s
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 8.0
dtype: float64
s['a':'c':2] #依据自己定义的数据类型进行切片,不是左闭右开了
a 1.0
c 5.0
dtype: float64
DataFrame
则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:
date = pd.date_range("20180101", periods = 6)
print(date)
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
'2018-01-05', '2018-01-06'],
dtype='datetime64[ns]', freq='D')
然后创建一个DataFrame
结构:
df = pd.DataFrame(np.random.randn(6,4), index = date, columns = list("ABCD"))
df
默认情况下,如果不指定index
参数和columns
,那么它们的值将从用0开始的数字替代。
df = pd.DataFrame(np.random.randn(6,4))
df
除了向DataFrame
中传入二维数组,我们也可以使用字典传入数据:
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
df2.dtypes #查看各个列的数据类型
A float64 B datetime64[ns] C float64 D int32 E category F object dtype: object
字典的每个key
代表一列,其value
可以是各种能够转化为Series
的对象。
与Series
要求所有的类型都一致不同,DataFrame
只要求每一列数据的格式相同。
head
和tail
方法可以分别查看最前面几行和最后面几行的数据(默认为5):
df.head()
最后3行:
df.tail(3)
下标使用index
属性查看:
df.index
DatetimeIndex([‘2018-01-01’, ‘2018-01-02’, ‘2018-01-03’, ‘2018-01-04’, ‘2018-01-05’, ‘2018-01-06’], dtype=‘datetime64[ns]’, freq=‘D’)
列标使用columns
属性查看:
df.columns
Index([‘A’, ‘B’, ‘C’, ‘D’], dtype=‘object’)
数据值使用values
查看:
df.values
array([[ 0.39194344, -1.25284255, -0.24764423, -0.32019526], [ 0.84548738, 0.20806449, -0.06983781, 0.13716277], [ 0.7767544 , -2.21517465, -1.11637102, 1.76383631], [ 0.01603994, 2.00619213, 0.22720908, 1.78369472], [-0.00621932, 0.59214148, 0.46235154, 0.99392424], [ 1.11272049, -0.22366925, 0.08422338, -0.5508679 ]])
我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。
df = pd.read_excel(r"C:\\Users\\Lovetianyi\\Desktop\\python\\作业3\\豆瓣电影数据.xlsx",index_col = 0)
#csv:read_csv;绝对路径或相对路径默认在当前文件夹下。r告诉编译器不需要转义#具体其它参数可以去查帮助文档 ?pd.read_excel
df.head()
df.iloc[0]
名字 肖申克的救赎 投票人数 692795 类型 剧情/犯罪 产地 美国 上映时间 1994-09-10 00:00:00 时长 142 年代 1994 评分 9.6 首映地点 多伦多电影节 Name: 0, dtype: object
df.iloc[0:5] #左闭右开
也可以使用loc
df.loc[0:5] #不是左闭右开
dit = {"名字":"复仇者联盟3","投票人数":123456,"类型":"剧情/科幻","产地":"美国","上映时间":"2018-05-04 00:00:00","时长":142,"年代":2018,"评分":np.nan,"首映地点":"美国"}
s = pd.Series(dit)
s.name = 38738
s
名字 复仇者联盟3 投票人数 123456 类型 剧情/科幻 产地 美国 上映时间 2018-05-04 00:00:00 时长 142 年代 2018 评分 8.7 首映地点 美国 Name: 38738, dtype: object
df = df.append(s) #覆盖掉原来的数据重新进行赋值
df[-5:]
df = df.drop([38738])
df[-5:]
df.columns
Index([‘名字’, ‘投票人数’, ‘类型’, ‘产地’, ‘上映时间’, ‘时长’, ‘年代’, ‘评分’, ‘首映地点’], dtype=‘object’)
df["名字"][:5] #后面中括号表示只想看到的行数,下同
0 肖申克的救赎 1 控方证人 2 美丽人生 3 阿甘正传 4 霸王别姬 Name: 名字, dtype: object
df[["名字","类型"]][:5]
df["序号"] = range(1,len(df)+1) #生成序号的基本方式
df[:5]
df = df.drop("序号",axis = 1) #axis指定方向,0为行1为列,默认为0
df[:5]