一、基础
1、概述
-
Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来
-
Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)
-
Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具
-
Pandas 是 Python 语言的一个扩展程序库,用于数据分析
-
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具
-
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)
-
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据
-
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征
-
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域
-
Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升,它主要实现了数据分析的五个重要环节:加载数据、整理数据、操作数据、构建数据模型、分析数据
2、安装
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
3、内置数据结构
Pandas 在 ndarray 数组(NumPy 中的数组)的基础上构建出了两种不同的数据结构,分别是 Series(一维数据结构)、DataFrame(二维数据结构):
-
Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等
-
DataFrame 是一种表格型数据结构,它既有行标签,又有列标签
数据结构 | 维度 | 说明 |
---|---|---|
Series | 1 | 该结构能够存储各种数据类型,比如字符数、整数、浮点数、Python 对象等,Series 用 name 和 index 属性来描述数据值。Series 是一维数据结构,因此其维数不可以改变 |
DataFrame | 2 | DataFrame 是一种二维表格型数据的结构,既有行索引,也有列索引。行索引是 index,列索引是 columns。 在创建该结构时,可以指定相应的索引值 |
4、Series
Pandas Series 类似表格中等一个列(column),类似于一维数组,可以保存任何数据类型 Series 由索引(index)和列组成,函数:
函数名 | 参数 |
---|---|
pandas.Series(data,index,dtype) | data:一组数据(ndarray 类型) index:数据索引标签,如果不指定,默认从 0 开始 dtype:数据类型,默认会自己判断 copy:表示对 data 进行拷贝,默认为 False |
结构图:
4.1 创建 Series 对象的方式
4.1.1 创建 Series 空对象
直接赋值创建Series 对象
4.1.2 ndarray 创建 Series 对象
4.1.3 字典创建 Series 对象
4.1.4 标量创建 Series 对象
import numpy as np
import pandas as pd
def pd_series():
# 空对象
s = pd.Series()
print(s)
# 列表对象,
s1 = pd.Series(["张三","李四","王五"])
print(s1)
print(s1[0])
# 指定索引
s2 = pd.Series([1,2,3],index = ["a","b","c"])
print(s2)
print(s2['b'])
# ndarray创建对象
arr = np.array([1,2,3,4])
s3 = pd.Series(arr)
print(s3)
# 字典创建对象
dic = {'name':'zhang','age':20,"sex":0}
s4 = pd.Series(dic)
print(s4)
# 标量对象
s5 = pd.Series(5,index=[1,2,3,4,5])
print(s5)
4.2 访问 Series 数据
import pandas as pd
def five():
data = {"name": "陈蕾", "gender": "男"}
result = pd.Series(data=data)
print(result["name"])
print(result[1])
4.3 Series 常用属性
名称 | 属性 |
---|---|
axes | 以列表的形式返回所有行索引标签 |
dtype | 返回对象的数据类型 |
empty | 返回一个布尔值,用于判断数据对象是否为空 |
ndim | 返回输入数据的维数 |
size | 返回输入数据的元素数量 |
values | 以 ndarray 的形式返回 Series 对象 |
index | 返回一个RangeIndex对象,用来描述索引的取值范围 |
def pd_series_attr():
s = pd.Series(['a','b','c','d','e'])
print(s.axes)
print(s.dtype)
print(s.empty)
print(s.ndim)
print(s.size)
print(s.values)
print(s.index)
4.4 Series 常用方法
4.4.1 head() 和 tail()
查看 Series 的某一部分数据,使用 head() 或者 tail() 方法。其中 head() 返回前 n 行数据,默认显示前 5 行数据,tail() 返回后 n 行数据,默认为后 5 行
import pandas as pd
# head() 返回前 n 行数据,默认显示前 5 行数据,tail() 返回后 n 行数据,默认为后 5 行
def seven():
result = pd.Series(['a','b','c','d','e','f'])
print("head() 返回前 5 行数据:")
print(result.head())
print("tail() 返回后 5 行数据:")
print(result.tail())
4.4.2 isnull() 和 nonull()
isnull() 和 nonull() 用于检测 Series、DataFrame 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少
函数名 | 参数 |
---|---|
pd.DataFrame( data, index, columns, dtype, copy) | data:一组数据(ndarray、series, map, lists, dict 等类型) index:索引值,或者可以称为行标签 coumns:列标签,默认为 RangeIndex (0, 1, 2, …, n) dtype:数据类型 copy:默认为 False,表示复制数据 data |
5.1 创建 DataFrame 对象
创建 DataFrame 对象的方式:
5.1.1 创建 DataFrame 空对象
import pandas as pd
# 创建 DataFrame 空对象
def one():
result = pd.DataFrame()
print(result)
5.1.2 列表创建 DataFrame 对象
import pandas as pd
# 列表创建 DataFrame 对象
def three():
data = ['小明','小红','小紫']
column = ['name']
result = pd.DataFrame(data=data,columns=column)
print(result)
5.1.2 列表嵌套列表创建 DataFrame 对象
import pandas as pd
# 列表创建 DataFrame 对象
def three():
data = [['小米', 18], ['小红', 19], ['小紫', 20]]
result = pd.DataFrame(data=data,columns=['name','age'])
print(result)
5.1.3 列表嵌套字典创建 DataFrame 对象
如果其中某个元素值缺失,也就是字典的 key 无法找到对应的 value,将使用 NaN 代替。
import pandas as pd
# 列表嵌套字典创建 DataFrame 对象
def four():
data = [{'name': "张三", 'age': 18},{'name': "小红", 'gender': "男", 'age': 19}]
result = pd.DataFrame(data=data)
print(result)
5.1.4 字典创建 DataFrame 对象
import pandas as pd
# 典创建 DataFrame 对象
def five():
data = {"name":['小米','小红','小紫'],"age":[18,19,20]}
result = pd.DataFrame(data=data)
print(result)
5.1.5 字典嵌套列表创建一个 DataFrame 对象
如果键 key 在字典键中不存在,对应值为 NaN。
import pandas as pd
# 字典嵌套列表创建一个 DataFrame 对象
def six():
data = [{'name': "张三", 'age': 18},{'name': "小红", 'gender': "男", 'age': 19}]
result = pd.DataFrame(data=data,index=['one','two'],columns=['name','age'])
result1 = pd.DataFrame(data=data,index=['one','two'],columns=['name','gender'])
print(result)
print(result1)
5.1.6 Series 创建 DataFrame 对象
对于 one 列而言,此处虽然显示了行索引 'd',但由于没有与其对应的值,所以它的值为 NaN。
import pandas as pd
# Series 创建 DataFrame 对象
def seven():
data = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
result = pd.DataFrame(data=data)
print(result)
第一列Series比第二列少一个元素,则以NaN填充,数据类型转换为float
5.2 列索引操作
DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作
5.2.1 选取数据
import pandas as pd
# 选取数据
def eight():
data = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
result = pd.DataFrame(data=data)
print(result)
print(result['one'])
5.2.2 添加数据
案例1:添加新列
import pandas as pd
# 添加数据
def nine():
data = {'one': pd.Series(data=[1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series(data=[1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
result = pd.DataFrame(data=data)
result['three'] = pd.Series(data=[11, 22, 33], index=['a', 'b', 'c'])
print("使用 df['列'] = 值,插入新的数据列:")
print(result)
案例2:在指定的位置插入新列
使用insert方法在指定位置插入新列,参数:
-
loc: 插入位置的列索引。
-
column: 新列的名称。
-
value: 要插入的 Series。
# 创建一个 DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
# 使用 insert 方法在位置 1 插入新列 'D'
df.insert(1, 'D', [13, 14, 15, 16])
print("插入新列后的 DataFrame:")
print(df)
5.2.3 修改数据
import pandas as pd
# 修改数据
def ten():
data = {'one': pd.Series(data=[1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series(data=[1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
result = pd.DataFrame(data=data)
print(result)
result['two'] = pd.Series(data=[1,2,3],index=['a','b','c'])
print("修改数据:")
print(result)
5.2.4 删除数据
. 通过drop方法删除 DataFrame 中的数据,默认情况下,drop() 不会修改原 DataFrame,而是返回一个新的 DataFrame。
语法:
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
参数:
-
labels:
-
类型:单个标签或列表。
-
描述:要删除的行或列的标签。如果 axis=0,则 labels 表示行标签;如果 axis=1,则 labels 表示列标签。
-
-
axis:
-
类型:整数或字符串,默认为 0。
-
描述:指定删除的方向。axis=0 或 axis='index' 表示删除行,axis=1 或 axis='columns' 表示删除列。
-
-
index:
-
类型:单个标签或列表,默认为 None。
-
描述:要删除的行的标签。如果指定,则忽略 labels 参数。
-
-
columns:
-
类型:单个标签或列表,默认为 None。
-
描述:要删除的列的标签。如果指定,则忽略 labels 参数。
-
-
level:
-
类型:整数或级别名称,默认为 None。
-
描述:用于多级索引(MultiIndex),指定要删除的级别。
-
-
inplace:
-
类型:布尔值,默认为 False。
-
描述:如果为 True,则直接修改原 DataFrame,而不是返回一个新的 DataFrame。
-
-
errors:
-
类型:字符串,默认为 'raise'。
-
描述:指定如何处理不存在的标签。'raise' 表示抛出错误,'ignore' 表示忽略错误。
-
删除列
import pandas as pd
result = pd.DataFrame()
result['one'] = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
result['two'] = pd.Series([5, 6, 7, 8], index=['a', 'b', 'c', 'd'])
print(result)
result1 = result.drop(['one'],axis=1)
print(result1)
删除行
result = pd.DataFrame()
result['one'] = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
result['two'] = pd.Series([5, 6, 7, 8], index=['a', 'b', 'c', 'd'])
print(result)
result1 = result.drop(['a'],axis=0)
print(result1)
直接删除原DataFrame和行或列
result = pd.DataFrame()
result['one'] = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
result['two'] = pd.Series([5, 6, 7, 8], index=['a', 'b', 'c', 'd'])
print(result)
result.drop(['a'], axis=0, inplace=True)
print(result)
5.3 行索引操作
5.3.1 loc 选取数据
df.loc[] 只能使用标签索引,不能使用整数索引。当通过标签索引的切片方式来筛选数据时,它的取值前闭后闭,也就是只包括边界值标签(开始和结束)
loc方法返回的数据类型:
1.如果选择单行或单列,返回的数据类型为Series
2.选择多行或多列,返回的数据类型为DataFrame
3.选择单个元素(某行某列对应的值),返回的数据类型为该元素的原始数据类型(如整数、浮点数等)。
语法:
DataFrame.loc[row_indexer, column_indexer]
参数:
-
row_indexer:行标签或布尔数组。
-
column_indexer:列标签或布尔数组。
import pandas as pd
# 创建一个示例 DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
# 使用 loc 选择数据
print(df.loc['a']) # 选择行标签为 'a' 的行
print(df.loc['a':'c']) # 选择行标签从 'a' 到 'c' 的行
print(df.loc['a', 'B']) # 选择行标签为 'a',列标签为 'B' 的元素
print(df.loc[['a', 'c'], ['A', 'C']]) # 选择行标签为 'a' 和 'c',列标签为 'A' 和 'C' 的数据
5.3.2 iloc 选取数据
iloc 方法用于基于位置(integer-location based)的索引,即通过行和列的整数位置来选择数据。
语法:
DataFrame.iloc[row_indexer, column_indexer]
参数:
-
row_indexer:行位置或布尔数组。
-
column_indexer:列位置或布尔数组。
案例:
import pandas as pd
# 创建一个示例 DataFrame
data = {
'A': [1, 2, 3],
'B': [4, 5, 6]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
# 创建一个示例 Series
new_row = pd.Series({'A': 7, 'B': 8}, name='d')
# 使用 append 追加 Series
df = df.append(new_row)
print(df)
# 创建另一个示例 DataFrame
new_data = {
'A': [9, 10],
'B': [11, 12]
}
new_df = pd.DataFrame(new_data, index=['e', 'f'])
# 使用 append 追加 DataFrame
df = df.append(new_df)
print(df)
5.3.5 删除数据行
您可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。使用的是 drop 函数
5.4 常用属性和方法
DataFrame 的属性和方法,与 Series 基本相同
名称 | 属性和方法描述 |
---|---|
T | 行和列转置。 |
axes | 返回一个仅以行轴标签和列轴标签为成员的列表。 |
dtypes | 返回每列数据的数据类型。 |
empty | DataFrame中没有数据或者任意坐标轴的长度为0,则返回True。 |
ndim | 轴的数量,也指数组的维数。 |
shape | 返回一个元组,表示了 DataFrame 维度。 |
size | DataFrame中的元素数量。 |
values | 使用 numpy 数组表示 DataFrame 中的元素值。 |
head() | 返回前 n 行数据。 |
tail() | 返回后 n 行数据。 |
data = {"A": [1, 2, 3, 4], "B": [5, 6, 7, 8]}
df = pd.DataFrame(data=data, index=['a', 'b', 'c', 'd'])
print(df.T)
print(df.axes)
print(df.dtypes)
print(df.empty)
print(df.ndim)
print(df.shape)
print(df.size)
print(df.values)
print(df.head(3))
print(df.tail(3))
二、函数
1、常用的统计学函数
函数名称 | 描述说明 |
---|---|
count() | 统计某个非空值的数量 |
sum() | 求和 |
mean() | 求均值 |
median() | 求中位数 |
std() | 求标准差 |
min() | 求最小值 |
max() | 求最大值 |
abs() | 求绝对值 |
prod() | 求所有数值的乘积 |
注意:numpy的方差默认为总体方差,pandas默认为样本方差
总体方差:
样本方差:
分母为n-1的样本方差的期望等于总体的方差,因此样本方差是总体方差的无偏估计。