一、基础
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 空对象
import pandas as pd
# Series 空对象
def one():
series_one = pd.Series(dtype='f8')
print('空对象:\n', series_one)
直接赋值创建Series 对象
series_one = pd.Series([1,2,3,4,5], dtype='f8')
print('Series对象:\n', series_one)
4.1.2 ndarray 创建 Series 对象
import pandas as pd
import numpy as np
# ndarray 创建 Series 对象
def two():
array_one = np.array(['小明','小红','小紫'])
index = np.arange(3)
series_one = pd.Series(data=array_one, index=index)
print('ndarray 创建 Series 对象:')
print(series_one)
4.1.3 字典创建 Series 对象
import pandas as pd
# 字典创建 Series 对象
def three():
data = {"name":"陈蕾","gender":"男"}
result = pd.Series(data=data)
print('字典创建 Series 对象:')
print(result)
4.1.4 标量创建 Series 对象
# 标量创建 Series 对象
def four():
result = pd.Series(data=5,index=[1,2,3,4,5])
print('标量创建 Series 对象:')
print(result)
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对象,用来描述索引的取值范围 |
案例:
import pandas as pd
def six():
result = pd.Series(['a','b','c','d','e'])
print("以列表的形式返回所有行索引标签:",result.axes)
print("返回对象的数据类型:",result.dtype)
print("返回一个布尔值,用于判断数据对象是否为空",result.empty)
print("返回输入数据的维数:",result.ndim)
print("返回输入数据的元素数量:",result.size)
print("以 ndarray 的形式返回 Series 对象:",result.values)
print("返回一个 RangeIndex 对象,用来描述索引的取值范围:",result.index)
输出:
以列表的形式返回所有行索引标签: [RangeIndex(start=0, stop=5, step=1)]
返回对象的数据类型: object
返回一个布尔值,用于判断数据对象是否为空: False
返回输入数据的维数: 1
返回输入数据的元素数量: 5
以 ndarray 的形式返回 Series 对象: ['a' 'b' 'c' 'd' 'e']
返回一个 RangeIndex 对象,用来描述索引的取值范围: RangeIndex(start=0, stop=5, step=1)
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 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少
- isnull():如果为值不存在或者缺失,则返回 True
- notnull():如果值不存在或者缺失,则返回 False
案例:
import pandas as pd
'''
isnull() 和 nonull() 用于检测 Series 中的缺失值
isnull():如果为值不存在或者缺失,则返回 True
notnull():如果值不存在或者缺失,则返回 False
'''
def eight():
result = pd.Series(['a','b','c','d','e','f',None])
print("isnull()如果为值不存在或者缺失,则返回 True:")
print(result.isnull())
print("notnull()如果值不存在或者缺失,则返回 False:")
print(result.notnull())
#过滤掉缺失值
print(result[result.notnull()])
5、DataFrame
-
DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。
-
DataFrame 的每一行数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列标签
-
同 Series 一样,DataFrame 自带行标签索引,默认为“隐式索引”即从 0 开始依次递增,行标签与 DataFrame 中的数据项一一对应当然你也可以用“显式索引”的方式来设置行标签
-
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 对象的方式:
- 列表
- 字典
- Series
- Numpy ndarrays
- 另一个 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’ 表示忽略错误。
**案例1:**删除列
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)
案例2:删除行
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)
案例3:直接删除原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, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
# 使用 iloc 选择数据
print(df.iloc[0]) # 选择第 0 行的数据
print(df.iloc[0:2]) # 选择第 0 到 1 行的数据
print(df.iloc[0, 1]) # 选择第 0 行,第 1 列的元素
print(df.iloc[[0, 2], [0, 2]]) # 选择第 0 和 2 行,第 0 和 2 列的数据
5.3.3 切片多行选取
通过切片的方式进行多行数据的选取
案例:
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'])
# 使用 df[0:2] 选择前两行
result = df[0:2]
print(type(result)) # 输出: <class 'pandas.core.frame.DataFrame'>
print(result)
切片获取行和通过iloc方法获取行从结果上没有区别,切片是基于位置的切片操作,iloc是基于位置的索引操作。
5.3.4 添加数据行
append() 方法用于将一个 Series 或 DataFrame 追加到另一个 DataFrame 的末尾。
语法:
DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=False)
参数:
- other:
- 类型:Series 或 DataFrame。
- 描述:要追加的数据。
- ignore_index:
- 类型:布尔值,默认为 False。
- 描述:如果为 True,则忽略原 DataFrame 的索引,并生成新的整数索引,索引值默认从0开始。
- verify_integrity:
- 类型:布尔值,默认为 False。
- 描述:如果为 True,则在创建具有重复索引的 DataFrame 时引发 ValueError。
- sort:
- 类型:布尔值,默认为 False。
- 描述:如果为 True,则在追加之前对列进行排序。
案例:
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)
案例2:添加新行
使用loc方法添加新行
# 创建一个 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'])
# 添加新行 'e'
df.loc['e'] = [17, 18, 19, 20]
print("添加新行后的 DataFrame:")
print(df)
5.3.5 删除数据行
您可以使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除。使用的是 drop 函数
案例:
import pandas as pd
# 删除数据行
def sixteen():
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("原数据:")
print(result)
print("drop 函数删除值:", )
result2 = result.drop('a')
print(result2)
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))
标签:24,10,Series,DataFrame,Day14,result,pd,print,data
From: https://blog.csdn.net/ctrey_/article/details/143216238