08 Python入门 Lesson8 Pandas
文章目录
本节好多内容参考了
Alien大大
的新版笔记,衷心感谢。
1.Pandas简介
Pandas 是 Python 中的数据操纵和分析软件包,它是基于Numpy去开发的,所以Pandas的数据处理速度也很快,而且Numpy中的有些函数在Pandas中也能使用,方法也类似。
Pandas 为 Python 带来了两个新的数据结构,即 Pandas Series(可类比于表格中的某一列)和 Pandas DataFrame(可类比于表格)。借助这两个数据结构,我们能够轻松直观地处理_带标签_数据和_关系_数据。
Series中各个元素的数据类型可以不一致,DataFrame也是如此,这与numpy的ndarray不同。
2.创建Pandas Series
可以使用 pd.Series(data, index)
命令创建 Pandas Series,其中data
表示输入数据, index
为对应数据的索引,除此之外,我们还可以添加参数dtype
来设置该列的数据类型。
示例:
import pandas as pd
pd.Series(data = [30, 6, 7, 5], index = ['eggs', 'apples', 'milk', 'bread'],dtype=float)
>>>
eggs 30.0 apples 6.0 milk 7.0 bread 5.0 dtype: float64
data
除了可以输入列表之外,还可以输入字典,或者是直接一个标量:
#data输入字典
pd.Series(data = {'eggs':30,'apples': 6, 'milk':7, 'bread':5},dtype=float)
>>>
apples 6.0 bread 5.0 eggs 30.0 milk 7.0 dtype: float64
#data输入某一标量
pd.Series(data = 7, index = ['eggs', 'apples', 'milk', 'bread'])
>>>
eggs 7 apples 7 milk 7 bread 7 dtype: int64
4.访问和删除Series中的元素
- 访问
访问Series中的元素有两种方法:
一种类似于从列表中按照索引访问数据,一种类似于从字典中按照key来访问value。
下面看示例:
从上面代码里也能发现,Pandas提供的iloc
与loc
分别对应着按索引访问和按key访问。
- 修改
因为Series是可更改类型,若想更改其中某一项,只需访问它然后重新赋值即可。
- 删除
可以使用 .drop()
方法删除 Pandas Series 中的条目。Series.drop(label)
方法会从给定 Series
中删除给定的 label
。这个label
可以是单个label或这是label组成的list。
但需要注意的是,.drop()
函数并不会修改原来的数据,如果你想要修改原数据的话,可以选择添加参数inplace = True
或者是用原数据替换s = s.drop(label)
5.对 Pandas Series 执行算术运算
和ndarray一样,Series也可以进行元素级的算术运算,也可以使用np中提供的各种运算函数,如sqrt()
等等。
这里可以想一下,如果Series中包含字符串,然后再进行乘法会是什么结果?
可以回想下字符串的知识'*'*10
的结果是什么?
7.创建 Pandas DataFrame
我们使用pd.DataFrame(data, index, columns)
来创建一个DataFrame。
其中:
data
是数据,可以输入ndarray,或者是字典(字典中可以包含Series或arrays或),或者是DataFrame;
index
是索引,输入列表,如果没有设置该参数,会默认以0开始往下计数;
columns
是列名,输入列表,如果没有设置该参数,会默认以0开始往右计数;
示例:
从上述代码中可以看出,字典d
中的key
被当作列名,value
被当作dataframe中的数据。
思考:如果在上述代码中添加一个columns列,如df = pd.DataFrame(data=d,index = ['a','b'],columns = ['col_1','col_2'])
,会返回什么结果呢?
8.访问 Pandas DataFrame 中的元素
与访问Series中的元素类似,我们可以通过列表式索引访问,也可以通过字典式Key值访问。
- 创建一个DataFrame
- 访问某一行
- 访问多行
- 访问某一列
- 访问多列
使用df.iloc[:,0:2]这种方法只能筛选出连续的列,那如果想要筛选的列分别在1,3,5,10:17怎么办呢?可以搜一下
np.r_
的用法。
-
访问某一行列的元素
-
删除元素
我们使用.drop
函数删除元素,默认为删除行,添加参数axis = 1
来删除列。
值得注意的是,drop
函数不会修改原数据,如果想直接对原数据进行修改的话,可以选择添加参数inplace = True
或用原变量名重新赋值替换。
- 增加元素
这里介绍了两种方法,一种是append()
,另外一种是insert()
,这两种方法都比较简单,可类比于python list中的两种方法进行学习。
此外,Pandas还提供了其他更为复杂的做DataFrame融合的函数,比如说concat()
、merge()
、join()
等等,相对难理解一些,我会单独出一份导学详细介绍这几个数据融合函数。
- 更改行列标签
使用函数rename()
即可。具体用法如下:
除此之外,还可以使用隐匿函数lambda来对行列标签进行统一处理,比如:
需要注意的是,rename()
函数同样不会更改原数据,如果想直接对原数据进行修改的话,可以选择添加参数inplace = True
或用原变量名重新赋值替换。
- 更改索引
可以使用函数set_index(index_label)
,将数据集的index设置为index_label
。
除此之外,还可以使用函数reset_index()
重置数据集的index为0开始计数的数列。
9.处理 NaN
NaN
就是Not a Number的缩写,表示这里有数据缺失。
- 查找NaN
我们可以使用isnull()
和notnull()
函数来查看数据集中是否存在缺失数据,在该函数后面添加sum()
函数来对缺失数量进行统计。除此之外,还可以使用count()
函数对非NaN数据进行统计计数。
- 删除NaN
使用dropna(axis)
函数可以删除包含NaN的行或列。
dropna()
函数还有一个参数是how
,当how = all
时,只会删除全部数据都为NaN的列或行。
同样,该函数也不会修改原数据集。
- 替换NaN
使用fillna()
函数可以替换NaN为某一值。其参数如下:
- value:用来替换NaN的值
- method:常用有两种,一种是
ffill
前向填充,一种是backfill
后向填充 - axis:0为行,1为列
- inplace:是否替换原数据,默认为False
- limit:接受int类型的输入,可以限定替换前多少个NaN
一般来说,我们常用均值去替换NaN。
还可以使用interpolate()
函数按照某一方法来替换NaN,课程中介绍了method为linear
时的用法,即忽略索引并将值视为相等间距,这是该函数的默认方法。更多method及解读请戳pandas.DataFrame.interpolate
11.将数据加载到 Pandas DataFrame 中
df = pd.read_csv(filename) #读取csv文件
df.info() #查看数据集信息
df.head() #查看前五行
df.tail() #查看后五行
df.sample() #查看随机一行
df.describe() #查看数据类型的基本统计信息
df.corr() #查看各列之间的相关系数
df.groupby() #将数据按照某一列进行聚类,后续接数据统计函数,如mean(),sum()等
Plus.stack和unstack
- 关于pandas里的stack和unstack翻到一个特别巧妙的解释:/stack&unstack/
- pandas的groupby 之后生成的是这种花括号结构(series 对应 stack 记忆),只有列有索引:
- 如果用了 unstack 会变成这种表格结构,具有行索引和列索引: