Pandas
一、pandas基本结构介绍
- Series
- 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很接近。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
- DataFrame
- 二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
二、Pandas库的Series类型
1.首先导入pandas及numpy
import numpy as np
import pandas as pd
2.用pandas中Series创建数组
t1 = pd.Series([7, 5, 6, 4])
t2 = pd.Series(np.arange(5), index=list("abcde"), dtype='i1')
3.Series索引和值
print(t2.index)
print(t2.values)
t2.index = list("ABCDE")
t2.index.name = "实验表"
print(t2)
""" 实验表
A 0
B 1
C 2
D 3
E 4
dtype: int8 """
4.Series切片
t2[1]
t2[:2]
""" 实验表
A 0
B 1
dtype: int8 """
t2[[1, 3]]
""" 实验表
B 1
D 3
dtype: int8 """
三、Pandas库的DataFrame类型
1.创建DataFrame结构
d1 = pd.DataFrame(np.random.randint(1, 20, (4, 6)), index=["第1行", "第2行", "第3行", "第4行"], columns = list("ABCDEF"), dtype=int)
d1
|
A |
B |
C |
D |
E |
F |
第1行 |
19 |
6 |
13 |
15 |
10 |
2 |
第2行 |
2 |
4 |
11 |
6 |
6 |
1 |
第3行 |
13 |
11 |
1 |
8 |
6 |
12 |
第4行 |
18 |
11 |
8 |
14 |
17 |
2 |
d2 = pd.DataFrame({"name": ["miry", "jake"], "age": [19, 21], "tel": ["114", "115"]}, index=['第1行', '第2行'])
d2
|
name |
age |
tel |
第1行 |
miry |
19 |
114 |
第2行 |
jake |
21 |
115 |
d3 = pd.DataFrame([{"name": "tom", "age": 15, "tel": "118"}, {"name": "john", "age": 20}, {"name": "Bob", "tel": 115}])
d3
|
name |
age |
tel |
0 |
tom |
15.0 |
118 |
1 |
john |
20.0 |
NaN |
2 |
Bob |
NaN |
115 |
2.DataFrame类型基本用法
print(d1.head(2))
print(d1.tail(3))
print(d1.index)
print(d1.columns)
print(d1.values)
""" [[19 6 13 15 10 2]
[ 2 4 11 6 6 1]
[13 11 1 8 6 12]
[18 11 8 14 17 2]] """
四、pandas读取数据及数据操作
1.读取数据
data = pd.read_excel(r"D:\excelData\豆瓣电影数据.xlsx")
data.head()
|
Unnamed: 0 |
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
0 |
0 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
1 |
1 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
2 |
2 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
3 |
3 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
4 |
4 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
2.数据预处理
print(len(data))
data = data.drop("Unnamed: 0", axis=1)
data.index = np.arange(1,38739)
data.head()
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
1 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
3 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
4 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
5 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
3.DataFrame行操作
3.1.行取值
data.loc[1]
data.loc[1:5]
data.loc[[1, 3, 5]]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
1 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
3 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
5 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
3.2.添加一行
addData = {"名字":"复仇者联盟3","投票人数":123456,"类型":"剧情/科幻","产地":"美国","上映时间":"2018-05-04 00:00:00","时长":142,"年代":2018,"评分":np.nan,"首映地点":"美国"}
addData = pd.Series(addData)
addData.name = 38739
addData
名字 复仇者联盟3
投票人数 123456
类型 剧情/科幻
产地 美国
上映时间 2018-05-04 00:00:00
时长 142
年代 2018
评分 NaN
首映地点 美国
Name: 38739, dtype: object
data = data.append(addData)
data.tail()
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38735 |
1935年 |
57.0 |
喜剧/歌舞 |
美国 |
1935-03-15 00:00:00 |
98 |
1935 |
7.6 |
美国 |
38736 |
血溅画屏 |
95.0 |
剧情/悬疑/犯罪/武侠/古装 |
中国大陆 |
1905-06-08 00:00:00 |
91 |
1986 |
7.1 |
美国 |
38737 |
魔窟中的幻想 |
51.0 |
惊悚/恐怖/儿童 |
中国大陆 |
1905-06-08 00:00:00 |
78 |
1986 |
8.0 |
美国 |
38738 |
列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... |
32.0 |
剧情/战争 |
苏联 |
1905-05-30 00:00:00 |
97 |
1977 |
6.6 |
美国 |
38739 |
复仇者联盟3 |
123456.0 |
剧情/科幻 |
美国 |
2018-05-04 00:00:00 |
142 |
2018 |
NaN |
美国 |
3.3.删除一行
data02 = data.head()
data02
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
1 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
3 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
4 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
5 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
data02 = data02.drop(1)
data02
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
3 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
4 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
5 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
3.4.删除多行
data02 = data02.drop([3, 4])
data02
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
5 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
4.DataFrame列操作
4.1.列取值
data["名字"]
data[["名字", "类型", "评分"]][2:5]
|
名字 |
类型 |
评分 |
3 |
美丽人生 |
剧情/喜剧/爱情 |
9.5 |
4 |
阿甘正传 |
剧情/爱情 |
9.4 |
5 |
霸王别姬 |
剧情/爱情/同性 |
9.4 |
data.loc[:, "名字"][:5]
data.loc[:, "名字":"产地"]
data.loc[:, ["名字", "评分", "投票人数"]]
data.loc[[1, 3, 4], ["名字", "产地"]]
|
名字 |
产地 |
1 |
肖申克的救赎 |
美国 |
3 |
美丽人生 |
意大利 |
4 |
阿甘正传 |
美国 |
5.条件选择
data["产地"] == "美国"
1 True
2 True
3 False
4 True
5 False
...
38735 True
38736 False
38737 False
38738 False
38739 True
Name: 产地, Length: 38739, dtype: bool
data[data["产地"] == "美国"][:5]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
1 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
4 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
6 |
泰坦尼克号 |
157074.0 |
剧情/爱情/灾难 |
美国 |
2012-04-10 00:00:00 |
194 |
2012 |
9.4 |
中国大陆 |
7 |
辛德勒的名单 |
306904.0 |
剧情/历史/战争 |
美国 |
1993-11-30 00:00:00 |
195 |
1993 |
9.4 |
华盛顿首映 |
data[(data.产地 == "美国") & (data.评分 > 9)][:5]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
1 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
4 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
6 |
泰坦尼克号 |
157074.0 |
剧情/爱情/灾难 |
美国 |
2012-04-10 00:00:00 |
194 |
2012 |
9.4 |
中国大陆 |
7 |
辛德勒的名单 |
306904.0 |
剧情/历史/战争 |
美国 |
1993-11-30 00:00:00 |
195 |
1993 |
9.4 |
华盛顿首映 |
6.缺失值及异常值处理
6.1.缺失值处理方法:
方法 |
说明 |
dropna |
根据标签中的缺失值进行过滤,删除缺失值 |
fillna |
对缺失值进行填充 |
isnull |
返回一个布尔值对象,判断哪些值是缺失值 |
notnull |
isnull的否定式 |
6.2.判断缺失值
data[data["名字"].isnull()][:5]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
232 |
NaN |
144.0 |
纪录片/音乐 |
韩国 |
2011-02-02 00:00:00 |
90 |
2011 |
9.7 |
美国 |
362 |
NaN |
80.0 |
短片 |
其他 |
1905-05-17 00:00:00 |
4 |
1964 |
5.7 |
美国 |
370 |
NaN |
5315.0 |
剧情 |
日本 |
2004-07-10 00:00:00 |
111 |
2004 |
7.5 |
日本 |
373 |
NaN |
263.0 |
短片/音乐 |
英国 |
1998-06-30 00:00:00 |
34 |
1998 |
9.2 |
美国 |
375 |
NaN |
47.0 |
短片 |
其他 |
1905-05-17 00:00:00 |
3 |
1964 |
6.7 |
美国 |
data[data["名字"].notnull()][:5]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
1 |
肖申克的救赎 |
692795.0 |
剧情/犯罪 |
美国 |
1994-09-10 00:00:00 |
142 |
1994 |
9.6 |
多伦多电影节 |
2 |
控方证人 |
42995.0 |
剧情/悬疑/犯罪 |
美国 |
1957-12-17 00:00:00 |
116 |
1957 |
9.5 |
美国 |
3 |
美丽人生 |
327855.0 |
剧情/喜剧/爱情 |
意大利 |
1997-12-20 00:00:00 |
116 |
1997 |
9.5 |
意大利 |
4 |
阿甘正传 |
580897.0 |
剧情/爱情 |
美国 |
1994-06-23 00:00:00 |
142 |
1994 |
9.4 |
洛杉矶首映 |
5 |
霸王别姬 |
478523.0 |
剧情/爱情/同性 |
中国大陆 |
1993-01-01 00:00:00 |
171 |
1993 |
9.4 |
香港 |
6.3填充缺失值
testData = pd.DataFrame([[1, 2, 3], [np.nan, 10, 4], [3, np.nan, 2]], index=[1, 2, 3], columns=list("ABC"))
testData
|
A |
B |
C |
1 |
1.0 |
2.0 |
3 |
2 |
NaN |
10.0 |
4 |
3 |
3.0 |
NaN |
2 |
print(np.mean(testData["A"]))
print(np.mean(testData["B"]))
2.0
6.0
testData.dropna()
data[data["评分"].isnull()][:10]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38739 |
复仇者联盟3 |
123456.0 |
剧情/科幻 |
美国 |
2018-05-04 00:00:00 |
142 |
2018 |
NaN |
美国 |
data["评分"].fillna(np.mean(data["评分"]), inplace = True)
data[-5:]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
38735 |
1935年 |
57.0 |
喜剧/歌舞 |
美国 |
1935-03-15 00:00:00 |
98 |
1935 |
7.600000 |
美国 |
38736 |
血溅画屏 |
95.0 |
剧情/悬疑/犯罪/武侠/古装 |
中国大陆 |
1905-06-08 00:00:00 |
91 |
1986 |
7.100000 |
美国 |
38737 |
魔窟中的幻想 |
51.0 |
惊悚/恐怖/儿童 |
中国大陆 |
1905-06-08 00:00:00 |
78 |
1986 |
8.000000 |
美国 |
38738 |
列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... |
32.0 |
剧情/战争 |
苏联 |
1905-05-30 00:00:00 |
97 |
1977 |
6.600000 |
美国 |
38739 |
复仇者联盟3 |
123456.0 |
剧情/科幻 |
美国 |
2018-05-04 00:00:00 |
142 |
2018 |
6.935704 |
美国 |
7.处理异常值
data[data["投票人数"] < 0]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
19778 |
皇家大贼 皇家大 |
-80.0 |
剧情/犯罪 |
中国香港 |
1985-05-31 00:00:00 |
60 |
1985 |
6.3 |
美国 |
19787 |
日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬 |
-80.0 |
纪录片 |
日本 |
1905-06-26 00:00:00 |
60 |
2004 |
7.9 |
美国 |
19798 |
女教徒 |
-118.0 |
剧情 |
法国 |
1966-05-06 00:00:00 |
135 |
1966 |
7.8 |
美国 |
data[data["投票人数"] % 1 != 0]
|
名字 |
投票人数 |
类型 |
产地 |
上映时间 |
时长 |
年代 |
评分 |
首映地点 |
19792 |
女教师 女教 |
8.30 |
剧情/犯罪 |
日本 |
1977-10-29 00:00:00 |
100 |
1977 |
6.6 |
日本 |
19805 |
女郎漫游仙境 ドレミファ娘の血は騒 |
5.90 |
喜剧/歌舞 |
日本 |
1985-11-03 00:00:00 |
80 |
1985 |
6.7 |
日本 |
19821 |
女仆日记 |
12.87 |
剧情 |
法国 |
2015-04-01 00:00:00 |
96 |
2015 |
5.7 |
法国 |
38056 |
逃出亚卡拉 |
12.87 |
剧情/动作/惊悚/犯罪 |
美国 |
1979-09-20 00:00:00 |
112 |
1979 |
7.8 |
美国 |
data = data[data.投票人数 > 0]
data = data[data["投票人数"] % 1 == 0]
8.数据保存
data.to_excel("D:\\excelData\\豆瓣电影修改版.xlsx")