pandas入门

Posted 临风而眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas入门相关的知识,希望对你有一定的参考价值。

Pandas入门(1)

其实七月份参加DataWhale组队学习的时候已经学了Pandas,但现在…看来还得重新学一遍

一.基本介绍

Python Data Analysis Library或pandas 是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模驻

供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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为主。

二.series类型

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

#np.nan代表空值
s=pd.Series([1,3,5,np.nan,6,9])
print(s)

运行结果

0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    9.0
dtype: float64

Series下标默认是数字(可以用额外参数来指定)

s2=pd.Series([1,9,231,415],index=['a','b','c','d'])
s2

运行结果

a      1
b      9
c    231
d    415
dtype: int64

索引:数据的行标签

可用.index来查看

print(s.index)
print(s2.index)

运行结果

RangeIndex(start=0, stop=6, step=1)
Index(['a', 'b', 'c', 'd'], dtype='object')

RangeIndex(start=0, stop=6, step=1)表示从0开始,到6结束,但是不包括6

可用.values来查看所有值

s.values

运行结果

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

s2.values

运行结果

array([  1,   9, 231, 415], dtype=int64)

切片操作

s[2:4] #左闭右开

运行结果

2    5.0
3    NaN
dtype: float64

s[::2]

运行结果

0    1.0
2    5.0
4    6.0
dtype: float64

利用索引查看

s[0]

运行结果

1.0

索引赋值

s.index.name='索引'
s

运行结果

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

​ 字母作索引

s.index=list('abcdef')
s
#和前面pd.Series然后给上index参数的效果一样

运行结果

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

此时用字符串的切片操作略有改变

s['a':'c']#用字符串是闭区间!

运行结果

a    1.0
b    3.0
c    5.0
dtype: float64

三.DataFrame类型

1.构造DataFrame

DataFrame是一个二维结构

先构造一个时间序列,作为第一维的下标

date=pd.date_range('20210810',periods=6)
print(date)

运行结果

DatetimeIndex(['2021-08-10', '2021-08-11', '2021-08-12', '2021-08-13',
               '2021-08-14', '2021-08-15'],
              dtype='datetime64[ns]', freq='D')

再创建DataFrame结构

df=pd.DataFrame(np.random.randn(6,4))
#六行四列
df
#默认索引从0开始

运行结果

0123
01.206358-0.158796-1.2285620.271269
1-0.0857200.351587-2.110459-2.524743
2-0.630313-0.3111410.1888650.998410
30.0584861.146728-2.884707-0.060104
4-1.759204-1.288462-1.3397360.492645
50.552470-1.8011060.149472-1.223125

修改行索引index

df2=pd.DataFrame(np.random.randn(6,4),index=date)
df2

运行结果

0123
2021-08-10-0.7519190.473604-1.738984-0.362240
2021-08-110.973062-0.5260560.4213330.422171
2021-08-120.585130-0.161462-0.3033300.076805
2021-08-13-0.1758190.228104-0.0086440.848540
2021-08-14-1.478600-0.015543-0.0949610.053557
2021-08-15-0.510944-2.1779331.107962-0.847353

修改列索引columns

df3=pd.DataFrame(np.random.randn(6,4),index=date,columns=list("ABCD"))

df3

运行结果

ABCD
2021-08-100.2628010.8051430.2282101.675223
2021-08-111.7482491.3787620.426678-1.576107
2021-08-12-0.4850130.5879130.2012311.135080
2021-08-130.7001901.266896-0.895503-1.272253
2021-08-141.3459200.886804-0.050278-0.639287
2021-08-15-1.496459-0.3748660.647694-0.550200

默认情况下,若不指定index参数和colunmns,则值为从0开始的数字

除了传入二维数组,还可以用字典来传入数据
字典的每个key代表一列,其value可以是各种能转化为Series的对象

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

#pd.Timestamp时间戳
df4 = pd.DataFrame({'A':1.,'B':pd.Timestamp('20210811'),'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'})
df4
ABCDEF
01.02021-08-111.03testabc
11.02021-08-111.03trainabc
21.02021-08-111.03testabc
31.02021-08-111.03trainabc

2.查看数据

头尾数据

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

df.head(3)

运行结果

0123
01.206358-0.158796-1.2285620.271269
1-0.0857200.351587-2.110459-2.524743
2-0.630313-0.3111410.1888650.998410
df.tail(3)

运行结果

0123
30.0584861.146728-2.884707-0.060104
4-1.759204-1.288462-1.3397360.492645
50.552470-1.8011060.149472-1.223125

查看每一列的数据类型

df4.dtypes

运行结果

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

下标,列标,数据

下标:index属性查看

df.index

运行结果

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

df3.index

运行结果

DatetimeIndex(['2021-08-10', '2021-08-11', '2021-08-12', '2021-08-13',
               '2021-08-14', '2021-08-15'],
              dtype='datetime64[ns]', freq='D')

列标:columns属性查看

df3.columns

运行结果

Index(['A', 'B', 'C', 'D'], dtype='object')

数据值:values查看

df.values

运行结果

array([[ 1.20635835, -0.15879606, -1.22856172,  0.27126942],
       [-0.08571984,  0.35158676, -2.11045931, -2.52474321],
       [-0.63031323, -0.31114102,  0.18886525,  0.99841011],
       [ 0.05848585,  1.14672784, -2.88470694, -0.06010371],
       [-1.75920402, -1.28846224, -1.33973556,  0.49264496],
       [ 0.55247033, -1.80110647,  0.1494715 , -1.2231253 ]])

四.pandas读取数据及数据操作

下面会以豆瓣电影数据为例贯穿学习过程,想要资源的小伙伴可以私信我😄

#路径一样,在同一文件夹下面,所以可以省略具体路径
Df=pd.read_excel('豆瓣电影数据.xlsx')

如果不在同一文件夹,用绝对路径呢?

要注意的就是,直接用反斜杠\\会报错,因为很多时候\\表示转义字符,这时候在路径前面加一个r防止转义就可以了

Df2 = pd.read_excel(r"C:\\Users\\86171\\Desktop\\数模\\豆瓣电影数据2.xlsx")

Df.head()
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
Df2.tail()
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
3873338733神学院 S46.0Adult法国1905-06-05 00:00:005819838.6美国
38734387341935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国
3873538735血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国
3873638736魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国
3873738737列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国

1.行操作

#第一行
Df.iloc[0]

运行结果

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

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

若用loc,则不是左闭右开

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

添加一行

可以先构造一个Series型数据,然后用append方法添加到DataFrame末尾

#添加复仇者联盟3
dit = {'名字': '复仇者联盟3:无限战争', '投票人数': 710371, '类型': '科幻', '产地': '美国','上映时间': '2018-05-11','时长':149,'年代':2018,'评分':8.1,'首映地点':'加州'}
s=pd.Series(dit)
#添加到最后一行
s.name=38738
s

运行结果

名字      复仇者联盟3:无限战争
投票人数         710371
类型               科幻
产地               美国
上映时间     2018-05-11
时长              149
年代             2018
评分              8.1
首映地点             加州
Name: 38738, dtype: object

要覆盖数据本身就要赋值!

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

删除一行

用drop方法

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

2.列操作

看各个列的名称:

Df.columns

运行结果

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

看具体一列的数据:Df[‘列名’]

Df['名字']

运行结果

0                                                   肖申克的救赎
1                                                     控方证人
2                                                    美丽人生 
3                                                     阿甘正传
4                                                     霸王别姬
                               ...                        
38733                                                神学院 S
38734                                                1935年
38735                                                 血溅画屏
38736                                               魔窟中的幻想
38737    列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...
Name: 名字, Length: 38738, dtype: object

指定要看的内容:再加一个中括号

Df['名字'][:5]

运行结果

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

查看具体几列的内容,放入列表

Df[['名字','评分']][:5]

运行结果

名字评分
0肖申克的救赎9.6
1控方证人9.5
2美丽人生9.5
3阿甘正传9.4
4霸王别姬9.4

增加一列

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

删除一列

Df = Df.drop(['序号'], axis = 1)
#默认是axis=0, 删除列是纵向axis=1
Df[:4]
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22.0美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映

通过标签进行数据选择

Df.loc[[index],[column]]

Df.loc[1,'名字']

运行结果

'控方证人'

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

3.条件选择

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

Df['产地']=='美国'

运行结果

0         True
1         True
2        False
3         True
4        False
         ...  
38733    False
38734     True
38735    False
38736    False
38737    False
Name: 产地, Length: 38738, dtype: bool

返回的结果是bool型的Series,可以用此Series作为索引

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

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

#可以直接写Df.产地 比写中括号简单
Df[(Df.产地=='美国')&(Df.评分>9)]
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
55.0泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆
66.0辛德勒的名单306904.0剧情/历史/战争美国1993-11-30 00:00:0019519939.4华盛顿首映
.................................
3795137951.0欢乐树的朋友们:赶尽杀绝4151.0喜剧/动画美国2005-11-28 00:00:008420059.2美国
3811938119.0山那边70.0剧情美国1975-11-14 00:00:0010319759.1美国
3845238452.062.0纪录片/短片美国2015-08-19 00:00:00920159.1纽约电影论坛
3846538465.0十二怒汉466.0剧情/悬疑/犯罪美国1954-09-20 00:00:005219549.3美国
3869038690.0周六夜现场193.0喜剧/音乐美国2003-10-11 00:00:009020039.4美国

300 rows × 10 columns

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

Df[((Df.产地=='美国')|(Df.产地=='中国大陆'))&(Df.评分>9)]
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
55.0泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.4中国大陆
.................................
3795137951.0欢乐树的朋友们:赶尽杀绝4151.0喜剧/动画美国2005-11-28 00:00:008420059.2美国
3811938119.0山那边70.0剧情美国1975-11-14 00:00:0010319759.1美国
3845238452.062.0纪录片/短片美国2015-08-19 00:00:00920159.1纽约电影论坛
3846538465.0十二怒汉466.0剧情/悬疑/犯罪美国1954-09-20 00:00:005219549.3美国
3869038690.0周六夜现场193.0喜剧/音乐美国2003-10-11 00:00:009020039.4美国

339 rows × 10 columns

五.缺失值及异常值的处理

1.缺失值处理方法

2.判断缺失值

#整份数据查看
Df.isnull()
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
0FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
3FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
4FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
.................................
38733FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
38734FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
38735FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
38736FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
38737FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse

38738 rows × 10 columns

一列一列看

Df['名字'].isnull()

运行结果

0        False
1        False
2        False
3        False
4        False
         ...  
38733    False
38734    False
38735    False
38736    False
38737    False
Name: 名字, Length: 38738, dtype: bool

返回的布尔值Series可作为索引

#前五行
Df[Df['名字'].isnull()][:5]
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
231231.0NaN144.0纪录片/音乐韩国2011-02-02 00:00:009020119.7美国
361361.0NaN80.0短片其他1905-05-17 00:00:00419645.7美国
369369.0NaN5315.0剧情日本2004-07-10 00:00:0011120047.5日本
372372.0NaN263.0短片/音乐英国1998-06-30 00:00:003419989.2美国
374374.0NaN47.0短片其他1905-05-17 00:00:00319646.7美国

查看非缺失数据

#看不缺失的
Df[Df['评分'].notnull()][:5]
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22.0美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

3.填充缺失值

数字型数据可用均值、中值等进行填充

#无缺失值
Df[Df['投票人数'].isnull()]
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点

很尴尬,这份数据的评分、投票人数等等数字型数据没有缺失值,那就人为构造吧

#添加复仇者联盟3
dit = {'名字': '复仇者联盟3:无限战争', '投票人数': np.nan, '类型': '科幻', '产地': '美国',
       '上映时间': '2018-05-11', '时长': pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”

pandas入门指南

text [检查特定的数据片段]取自论文但有意思应用。 #python #pandas

python之pandas入门操作

pandas入门

Atom编辑器入门到精通 Atom使用进阶