python数据分析之pandas

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)    # Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
print(t2.values)   # [0 1 2 3 4]
t2.index = list("ABCDE")  # 改索引
t2.index.name = "实验表"  # 命名t2
print(t2)
"""    实验表
       A    0
       B    1
       C    2
       D    3
       E    4
       dtype: int8    """
4.Series切片
t2[1]    # 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))    # 取前2行,不填默认取前5行
print(d1.tail(3))    # 取后3行,不填默认取后5行
print(d1.index)      # Index(['第1行', '第2行', '第3行', '第4行'], dtype='object')
print(d1.columns)    # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
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")  # r 表示不需要转义
# data.to_excel("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))  # 38738  即 0 - 38737
data = data.drop("Unnamed: 0", axis=1)    # 删除列 Unnamed: 0
data.index = np.arange(1,38739)    # 行改为从1-38738
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]    # loc 是 取对应index的数字

# 取连续多行
data.loc[1:5]  # loc 取 index为1 - 5,可以取到5

# 取不连续多行
data.loc[[1, 3, 5]]

# 也可以用 data.iloc[1]   表示取第2个
# loc是按index标记        iloc是从0开始
名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
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.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.列取值
# print(data.columns)
# Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')

# 第1种方式取值

# 取一列
data["名字"]

# 取多列
data[["名字", "类型", "评分"]][2:5]    # 后面中括号表示只想看到的行数,下同
名字 类型 评分
3 美丽人生 剧情/喜剧/爱情 9.5
4 阿甘正传 剧情/爱情 9.4
5 霸王别姬 剧情/爱情/同性 9.4
# 第2种方式取值

# 取一列
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]    # data.标签  更简洁的写法
名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
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()
# df.dropna() 参数
# how = 'all':删除全为空值的行或列
# inplace = True: 覆盖之前的数据
# axis = 0: 选择行或列,默认是行
A B C
1 1.0 2.0 3
data[data["评分"].isnull()][:10] # 注意这里特地将前面加入的复仇者联盟令其评分缺失来举例
名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
38739 复仇者联盟3 123456.0 剧情/科幻 美国 2018-05-04 00:00:00 142 2018 NaN 美国
data["评分"].fillna(np.mean(data["评分"]), inplace = True) #使用均值来进行替代,inplace意为直接在原始数据中进行修改
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") #默认路径为现在文件夹所在的路径

你可能感兴趣的:(pandas,python,数据分析)