python数据分析之Panads-1

视频:课程3_哔哩哔哩_bilibili

目录

python数据分析之Panads-1

1.1 Panads基本介绍

Pandas 基本数据结构

1.2 Pandas库的series类型

索引——数据的行标签

1.3 Pandas库的DataFrame类型

查看数据

下标,列标,数据

1.4 pandas读取数据及数据操作

行操作

列操作

条件选择

1.5 缺失值及异常值处理

缺失值处理方法:

判断缺失值

填充缺失值

删除缺失值

处理异常值

1.6 数据保存

数据处理之后,然后将数据重新保存到movie_data.xlsx


python数据分析之Panads-1

1.1 Panads基本介绍

Python Data Analysis Library 或 Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

In [ ]:

import pandas as pd
import numpy as np

Pandas 基本数据结构

pandas有两种常用的基本结构:

  • Series
    • 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很接近。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
  • DataFrame
    • 二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

1.2 Pandas库的series类型

一维Series可以用一维列表初始化:

In [ ]:

s = pd.Series([1,3,5,np.nan,6,8]) #index = ['a','b','c','d','x','y'])设置索引,np.nan设置空值
print(s)
ss = pd.Series([1,3,5,np.nan,6,8], index = ['a','b','c','d','x','y']) #index = ['a','b','c','d','x','y'])
print(ss)
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64
a    1.0
b    3.0
c    5.0
d    NaN
x    6.0
y    8.0
dtype: float64

默认情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。

索引——数据的行标签

In [ ]:

s.index #显示索引,从0到6(不含),1为步长

Out[ ]:

RangeIndex(start=0, stop=6, step=1)

In [ ]:

s.values

Out[ ]:

array([ 1.,  3.,  5., nan,  6.,  8.])

In [ ]:

s[3]

Out[ ]:

nan

切片操作

In [ ]:

s[2:5] #左闭右开

Out[ ]:

2    5.0
3    NaN
4    6.0
dtype: float64

In [ ]:

s[::2]

Out[ ]:

0    1.0
2    5.0
4    6.0
dtype: float64

索引赋值

In [ ]:

s.index.name = '索引'  # 索引命名
s

Out[ ]:

索引
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

In [ ]:

s.index = list('abcdef')
s

Out[ ]:

a    1.0
b    3.0
c    5.0
d    NaN
e    6.0
f    8.0
dtype: float64

In [ ]:

s['a':'c':2] #依据自己定义的数据类型进行切片,不是左闭右开了

Out[ ]:

a    1.0
c    5.0
dtype: float64

1.3 Pandas库的DataFrame类型

DataFrame则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:

In [ ]:

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结构:

In [ ]:

df = pd.DataFrame(np.random.randn(6,4), index = date, columns = list("ABCD"))
# 6行4列  index行索引  columns列索引
df

Out[ ]:

ABCD
2018-01-01-1.241676-1.5713940.1060470.358907
2018-01-02-1.439755-0.8081850.0601310.215150
2018-01-03-2.0757861.1077690.879275-0.306302
2018-01-040.5908960.0108190.730009-1.382649
2018-01-050.8862410.162687-0.272916-1.304492
2018-01-061.2025651.4953110.6134570.862442

默认情况下,如果不指定index参数和columns,那么它们的值将从用0开始的数字替代。

In [ ]:

df = pd.DataFrame(np.random.randn(6,4))
df

Out[ ]:

0123
0-0.3969860.0916852.8739970.393454
10.3956750.977006-0.542596-0.023109
2-0.886602-1.016435-0.083989-1.354806
3-0.8459090.8866940.388768-0.199145
4-0.255430-1.652886-0.7461690.803175
5-1.025498-0.4015670.347465-1.291498

除了向DataFrame中传入二维数组,我们也可以使用字典传入数据:

In [ ]:

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

Out[ ]:

ABCDEF
01.02018-10-011.03testabc
11.02018-10-011.03trainabc
21.02018-10-011.03testabc
31.02018-10-011.03trainabc

In [ ]:

df2.dtypes #查看各个列的数据类型

Out[ ]:

A           float64
B    datetime64[ns]
C           float64
D             int32
E          category
F            object
dtype: object

字典的每个key代表一列,其value可以是各种能够转化为Series的对象。

Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同。

查看数据

头尾数据

headtail方法可以分别查看最前面几行和最后面几行的数据(默认为5):

In [ ]:

df.head()

Out[ ]:

0123
0-0.3969860.0916852.8739970.393454
10.3956750.977006-0.542596-0.023109
2-0.886602-1.016435-0.083989-1.354806
3-0.8459090.8866940.388768-0.199145
4-0.255430-1.652886-0.7461690.803175

最后3行:

In [ ]:

df.tail(3) # 没有参数 默认最后5行

Out[ ]:

0123
3-0.8459090.8866940.388768-0.199145
4-0.255430-1.652886-0.7461690.803175
5-1.025498-0.4015670.347465-1.291498

下标,列标,数据

下标使用index属性查看:

In [ ]:

df.index

Out[ ]:

RangeIndex(start=0, stop=6, step=1)

列标使用columns属性查看:

In [ ]:

df.columns

Out[ ]:

RangeIndex(start=0, stop=4, step=1)

数据值使用values查看:

In [ ]:

df.values

Out[ ]:

array([[-0.39698634,  0.09168473,  2.87399654,  0.39345434],
       [ 0.39567543,  0.97700555, -0.5425961 , -0.02310854],
       [-0.88660194, -1.01643485, -0.08398921, -1.3548057 ],
       [-0.84590888,  0.88669353,  0.38876774, -0.19914459],
       [-0.25542972, -1.65288596, -0.74616901,  0.80317473],
       [-1.02549823, -0.40156725,  0.34746527, -1.29149787]])

1.4 pandas读取数据及数据操作

我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。

In [ ]:

df = pd.read_excel(r".\豆瓣电影数据.xlsx",index_col = 0) 
#csv:read_csv;绝对路径或相对路径默认在当前文件夹下。r告诉编译器不需要转义
#具体其它参数可以去查帮助文档 ?pd.read_excel

In [ ]:

df.head()

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

行操作

In [ ]:

df.iloc[0] # 查看某行

Out[ ]:

名字                   肖申克的救赎
投票人数               692795.0
类型                    剧情/犯罪
产地                       美国
上映时间    1994-09-10 00:00:00
时长                      142
年代                     1994
评分                      9.6
首映地点                 多伦多电影节
Name: 0, dtype: object

In [ ]:

df.iloc[0:5] #左闭右开

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

也可以使用loc

In [ ]:

df.loc[0:5] #不是左闭右开,而是都闭

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
5泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆

添加一行

In [ ]:

# 通过定义字典数据来添加
dit = {"名字":"复仇者联盟3","投票人数":123456,"类型":"剧情/科幻","产地":"美国","上映时间":"2018-05-04 00:00:00","时长":142,"年代":2018,"评分":np.nan,"首映地点":"美国"}
s = pd.Series(dit)
s.name = 38738

In [ ]:

s

Out[ ]:

名字                   复仇者联盟3
投票人数                 123456
类型                    剧情/科幻
产地                       美国
上映时间    2018-05-04 00:00:00
时长                      142
年代                     2018
评分                      NaN
首映地点                     美国
Name: 38738, dtype: object

In [ ]:

df = df.append(s) #覆盖掉原来的数据重新进行赋值
df[-5:]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
387341935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国
38735血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国
38736魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国
38737列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国
38738复仇者联盟3123456.0剧情/科幻美国2018-05-04 00:00:001422018NaN美国

删除一行

In [ ]:

df = df.drop([38738])
df[-5:]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
38733神学院 S46.0Adult法国1905-06-05 00:00:005819838.6美国
387341935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国
38735血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国
38736魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国
38737列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国

列操作

In [ ]:

df.columns

Out[ ]:

Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')

In [ ]:

df["名字"][:5] #后面中括号表示只想看到的行数,下同

Out[ ]:

0    肖申克的救赎
1      控方证人
2     美丽人生 
3      阿甘正传
4      霸王别姬
Name: 名字, dtype: object

In [ ]:

df[["名字","类型"]][:5]

Out[ ]:

名字类型
0肖申克的救赎剧情/犯罪
1控方证人剧情/悬疑/犯罪
2美丽人生剧情/喜剧/爱情
3阿甘正传剧情/爱情
4霸王别姬剧情/爱情/同性

增加一列

In [ ]:

df["序号"] = range(1,len(df)+1) #生成序号的基本方式
df[:5]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点序号
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节1
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国2
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利3
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映4
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港5

删除一列

In [ ]:

df = df.drop("序号",axis = 1) #axis指定方向,0为行1为列,默认为0
df[:5]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

通过标签选择数据

df.loc[[index],[colunm]]通过标签选择数据

In [ ]:

df.loc[1,"名字"]

Out[ ]:

'控方证人'

In [ ]:

df.loc[[1,3,5,7,9],["名字","评分"]] #多行跳行多列跳列选择

Out[ ]:

名字评分
1控方证人9.5
3阿甘正传9.4
5泰坦尼克号9.4
7新世纪福音战士剧场版:Air/真心为你 新世紀エヴァンゲリオン劇場版 Ai9.4
9这个杀手不太冷9.4

条件选择

选取产地为美国的所有电影

In [ ]:

df[df["产地"] == "美国"][:5] # df["产地"] == "美国"运行结果为bool,只取前5行

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
5泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆
6辛德勒的名单306904.0剧情/历史/战争美国1993-11-30 00:00:0019519939.4华盛顿首映

选取产地为美国的所有电影,并且评分大于9分的电影

In [ ]:

df[(df.产地 == "美国") & (df.评分 > 9)][:5] #df.标签:更简洁的写法

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
5泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆
6辛德勒的名单306904.0剧情/历史/战争美国1993-11-30 00:00:0019519939.4华盛顿首映

选取产地为美国或中国大陆的所有电影,并且评分大于9分

In [ ]:

df[((df.产地 == "美国") | (df.产地 == "中国大陆")) & (df.评分 > 9)][:5]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
5泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆

1.5 缺失值及异常值处理

缺失值处理方法:

方法说明
dropna根据标签中的缺失值进行过滤,删除缺失值
fillna对缺失值进行填充
isnull返回一个布尔值对象,判断哪些值是缺失值
notnullisnull的否定式

判断缺失值

In [ ]:

df[df["名字"].isnull()][:10] # 列出前10个缺失名字的

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
231NaN144.0纪录片/音乐韩国2011-02-02 00:00:009020119.7美国
361NaN80.0短片其他1905-05-17 00:00:00419645.7美国
369NaN5315.0剧情日本2004-07-10 00:00:0011120047.5日本
372NaN263.0短片/音乐英国1998-06-30 00:00:003419989.2美国
374NaN47.0短片其他1905-05-17 00:00:00319646.7美国
375NaN1193.0短片/音乐法国1905-07-01 00:00:001020107.7美国
411NaN32.0短片其他1905-05-17 00:00:00319647.0美国
432NaN1081.0剧情/动作/惊悚/犯罪美国2016-02-26 00:00:0011520166.0美国
441NaN213.0恐怖美国2007-03-06 00:00:008320073.2美国
448NaN110.0纪录片荷兰2002-04-19 00:00:004820009.3美国

In [ ]:

df[df["名字"].notnull()][:5]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
1控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
2美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
3阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
4霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

填充缺失值

In [ ]:

df[df["评分"].isnull()][:10] 
#注意这里特地将前面加入的复仇者联盟令其评分缺失来举例

Out[ ]:

In [ ]:

df["评分"].fillna(np.mean(df["评分"]), inplace = True) 
#使用均值来进行替代,inplace意为直接在原始数据中进行修改
df[-5:]

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
38733神学院 S46.0Adult法国1905-06-05 00:00:005819838.6美国
387341935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国
38735血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国
38736魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国
38737列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国

In [ ]:

df1 = df.fillna("未知电影") 
#谨慎使用,除非确定所有的空值都是在一列中,否则所有的其他列的空值都会填成这个
#不可采用df["名字"].fillna("未知电影")的形式,因为填写后数据格式就变了,变成Series了

In [ ]:

df1[df1["名字"].isnull()][:10]

Out[ ]:

删除缺失值

df.dropna() 参数

how = 'all':删除全为空值的行或列
inplace = True: 覆盖之前的数据
axis = 0: 选择行或列,默认是行

In [ ]:

len(df)

Out[ ]:

38738

In [ ]:

df2 = df.dropna()

In [ ]:

len(df2)

Out[ ]:

38175

In [ ]:

df.dropna(inplace = True)

In [ ]:

len(df) #inplace覆盖掉原来的值

Out[ ]:

38175

处理异常值

异常值,即在数据集中存在不合理的值,又称离群点。比如年龄为-1,笔记本电脑重量为1吨等,都属于异常值的范围。

In [ ]:

df[df["投票人数"] < 0] #直接删除,或者找原始数据来修正都行

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
19777皇家大贼 皇家大-80.0剧情/犯罪中国香港1985-05-31 00:00:006019856.3美国
19786日本的垃圾去中国大陆 にっぽんの“ゴミ” 大陆へ渡る ~中国式リサイクル錬-80.0纪录片日本1905-06-26 00:00:006020047.9美国
19797女教徒-118.0剧情法国1966-05-06 00:00:0013519667.8美国

In [ ]:

df[df["投票人数"] % 1 != 0] #小数异常值

Out[ ]:

名字投票人数类型产地上映时间时长年代评分首映地点
19791女教师 女教8.30剧情/犯罪日本1977-10-29 00:00:0010019776.6日本
19804女郎漫游仙境 ドレミファ娘の血は騒5.90喜剧/歌舞日本1985-11-03 00:00:008019856.7日本
19820女仆日记12.87剧情法国2015-04-01 00:00:009620155.7法国
38055逃出亚卡拉12.87剧情/动作/惊悚/犯罪美国1979-09-20 00:00:0011219797.8美国

对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了

其他属性的异常值处理,我们会在格式转换部分,进一步讨论

In [ ]:

df = df[df.投票人数 > 0]
df = df[df["投票人数"] % 1 == 0]

1.6 数据保存

数据处理之后,然后将数据重新保存到movie_data.xlsx

In [ ]:

df.to_excel("movie_data.xlsx") #默认路径为现在文件夹所在的路径
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值