💖本文收录于【Python数据分析三大库:numpy、pandas、matplotlib】专栏,此专栏主要记录我在B站学习Python数据分析三剑客—numpy、pandas、matplotlib的学习笔记,对于入门数据分析或者着手python数学建模的小白来说特别友好,欢迎订阅!
🌻个人主页:Glion的职场晋升成长之路
📑个人介绍:保研到某985高校,硕士在读中,将在努力成为数据科学家的道路上不断深耕!
Python数据分析—Pandas1
🍍0. Pandas 基本介绍
Python Data Analysis Library 或pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效操作大型数据集所需的工具。Pandas提供了大量能使我们快速处理数据的函数和方法。
在使用之前要导入这两个库
import pandas as pd
import numpy as np
🍎1.Pandas 基本数据结构
pandas中有两种常用的基本结构:
- Series
- 一维数组,与Numpy中的一维array类似。二者与Python基本数据结构List也很相似。Series能保存不同的数据类型,字符串、布尔值、数字等都能保存在Series中。
- DataFrame
- 二维的表格型数据结构。很多功能与R中的data frame类似。可以将DataFrame 理解为Series的容器。以下的内容主要以DataFrame为主。
1.1Pandas 库的series类型
- 一维Series可以用一维列表初始化:
a=pd.Series([1,3,5,np.nan,6,8])
print(a)
输出的第一列为列表各元素索引,第二列为对应的列表具体值
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
可以在pd.Series中用index指定索引号类型,一般不指定的话默认为从0开始的递增数字
s=pd.Series([1,3,5,np.nan,7,9],index=['a','b','c','d','e','f'])
print(s)
a 1.0
b 3.0
c 5.0
d NaN
e 7.0
f 9.0
dtype: float64
- 索引-数据的行标签
某.index可以查看该数组的行标签,即索引号情况。
a.index
#out
RangeIndex(start=0, stop=6, step=1)
s.index
#out
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
查看s的具体数值
print(s.values)
print(s[3])
[ 1. 3. 5. nan 7. 9.]
nan
- 切片操作
a[2:5]
#out
2 5.0
3 NaN
4 6.0
dtype: float64
间隔取数[a:b:c],从a取到b-1,步长为c
s[::2]
#out
a 1.0
c 5.0
e 7.0
dtype: float64
- 索引赋值
s.index.name='索引'
s
#out
索引
a 1.0
b 3.0
c 5.0
d NaN
e 7.0
f 9.0
dtype: float64
a=pd.Series([11,22,31,43,52,62])
a.index=list('abcdef')
a
#out
a 11
b 22
c 31
d 43
e 52
f 62
dtype: int64
取出特定索引号上的值,注意此时是左右两边都会取到,不是按照左闭右开来取
s['a':'c']
#out
a 11
b 22
c 31
dtype: int64
1.2Pandas库的DataFrame类型
DataFrame 则是个二维结构,这里首先构造一组时间序列,作为我们的第一维的下标:
#20180101是起点,需要几个日期就用periods=多少来表示
date=pd.date_range('20220615',periods=6)
print(date)
DatetimeIndex(['2022-06-15', '2022-06-16', '2022-06-17', '2022-06-18',
'2022-06-19', '2022-06-20'],
dtype='datetime64[ns]', freq='D')
然后创建一个DataFrame结构,所用函数为:xx=pd.DataFrame()
#二维结构内的数据可以用np.random随机生成,随机生成得数据服从正态分布:randn,(6,4)代表6行4列
df=pd.DataFrame(np.random.randn(6,4))
输出结果如下:
- 也可以对索引号的行和列进行命名,默认情况下,如果不指定index参数和columns,那么索引号的值将用从0开始的数字替代。`
df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD'))
df
- 除了向DataFrame中传入二维数组,我们也可以使用字典传入数据:
字典的每一个key代表一列,其value可以是各种能够转化为Series的对象
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'})
df2
注意:与Series要求的所有类型都一致不同,DataFrame只要求每一列数据的格式相同:
df2.dtypes
查看数据
- 头尾数据
head和tail方法可以分别查看最前面几行和最后面几行的数据(默认为5):
df.tail(3)
- 下标,列标,数据
下标使用index属性查看,列表使用columns属性查看,具体值使用values查看:
🍏2.Pandas读取数据及数据操作
我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。
# r表示\不进行转义,''里面是excel的路径
df=pd.read_excel(r'C:\Users\GJH\Blili-homework of Python\课程中用到的数据\豆瓣电影数据.xlsx')
df.head()
2.1行操作
-
查看表格的行操作
df.iloc[a:b]查看a到b-1行的数值情况,df.loc[a:b]表示查看a到b行的数字情况。
-
添加一行
dit={'名字':'复仇者联盟','投票人数':123456,'类型':'剧情/科幻','产地':'美国','上映时间':'2018-05-4 00:00:00','时长':142,'年代':2018,'评分':8.7,'首映地点':'美国'}
s=pd.Series(dit)
s.name=38738
s
df=df.append(s)
df[-5:]
- 删除一行
df=df.drop([38737])
df[-5:]
2.2列操作
- 查看表格的列操作
- 增加一列
df['电影ID']=range(1,len(df)+1)
df[:5]
- 删除一列
注意:df.drop()中不写时默认的axis=0,表示删除的是行,如果写axis=1,则表示删除的是列。
2.3通过标签选择数据
- 通过标签选择数据:
df.loc[[index].[column]]
2.4条件选择
(1)选取产地为美国的所有电影
当进行满足某条件进行筛选时,可以借助布尔值True或Faulse进行判断,然后挑选出Ture的所有行
(2)筛选出产地为美国且评分大于9分的电影
(3)筛选出产地为美国或中国大陆且评分大于9分的电影
🍒3.缺失值和异常值的处理
3.1缺失值处理方法
方法 | 说明 |
---|---|
dropna | 根据标签中的缺失值进行过滤,删除缺失值 |
fillna | 对缺失值进行填充 |
isnull | 返回一个布尔值对象,判断哪些值是缺失值 |
notnull | isnull的否定式 |
- 判断缺失值
- 填充缺失值
(1)将电影评分的缺失值填充为均值
(2)将确实的电影名称填充为“未知电影”
- 删除缺失值
关于df.dropna()的参数设置:
how=‘all’:删除全为空值的行或列;
how='any’时表示删除只要含有缺失值的行(列)
inplace=True:覆盖之前的数据
axis=0:删除含有缺失值的行(默认情况dropna()就是axis=0
)
axis=1:删除含有缺失值的列
pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改
3.2处理异常值
-异常值,即在数据值中存在不合理的值,又称离群点。比如年龄为-1,笔记本电脑重量为1吨等,都属于异常值。
注意:对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们可以直接删除,其他属性的异常值处理,再后面的格式转换部分,进一步讨论。
🍉4.数据保存
数据处理之后,将数据重新保存到movie_data.xlsx
df.to_excel('movie_data.xlsx')#默认保存在当下notebook的路径里面 C:\Users\GJH