Python的三方库之Pandas(三)
Python的三方库之Pandas(三)
文章目录
- Python的三方库之Pandas(三)
- 一、pandas是什么?
- 1.1 Pandas 的核心数据结构
- 1.2 Pandas 的主要功能
- 1.3. Pandas 的应用场景
- 二、Series()函数
- 2.1 创建Series对象的方式
- 2.2 访问Series对象的数据
- 2.3 遍历Series对象
- 2.4 常用的方法
- 三、DataFrame
- 3.1 创建 DataFrame 对象
- 3.1.1 创建 DataFrame 空对象
- 3.1.2 列表嵌套字典创建 DataFrame 对象
- 3.1.3 字典嵌套列表创建 DataFrame 对象
- 3.1.4 Series 创建 DataFrame 对象
- 3.2 列索引操作
- 3.2.1选取数据
- 3.2.2 添加数据
- 3.2.3 修改数据
一、pandas是什么?
Pandas 是一个开源的 Python 数据分析和操作库,它提供了高性能、易用的数据结构和数据分析工具,广泛应用于数据科学、机器学习、金融分析等领域。以下是关于 Pandas 的详细介绍:
1.1 Pandas 的核心数据结构
DataFrame
:- 这是 Pandas 最重要的数据结构之一,它是一个二维表格型数据结构,类似于 Excel 中的工作表。它由行和列组成,每一列可以存储不同类型的数据(如整数、浮点数、字符串等)。
- 例如,可以用来存储一个公司的员工信息表,其中每一列代表员工的姓名、年龄、职位等信息,每一行代表一个员工。
Series
:- 它是一维数组,类似于 Python 中的列表,但与列表不同的是,Series 有一个索引(index)。索引可以是数字、字符串或其他类型,用于标识每个元素。
- 例如,可以用来存储某个月份每天的气温数据,索引是日期,值是对应的气温。
1.2 Pandas 的主要功能
- 数据读取与写入:
- Pandas 支持多种数据格式的读取和写入,包括 CSV、Excel、JSON、SQL 数据库等。例如,可以使用
pd.read_csv()
函数从 CSV 文件中读取数据,使用df.to_excel()
将数据保存到 Excel 文件中。
- Pandas 支持多种数据格式的读取和写入,包括 CSV、Excel、JSON、SQL 数据库等。例如,可以使用
- 数据清洗与预处理:
- 提供了强大的数据清洗功能,如处理缺失值(用填充、删除等方法)、去除重复数据、数据类型转换等。例如,可以使用
df.dropna()
删除缺失值,使用df.fillna()
填充缺失值。
- 提供了强大的数据清洗功能,如处理缺失值(用填充、删除等方法)、去除重复数据、数据类型转换等。例如,可以使用
- 数据筛选与排序:
- 可以根据条件筛选数据,例如选择某列大于某个值的行,也可以按某列或多列对数据进行排序。例如,
df[df['age'] > 30]
可以筛选出年龄大于 30 的数据。
- 可以根据条件筛选数据,例如选择某列大于某个值的行,也可以按某列或多列对数据进行排序。例如,
- 数据分组与聚合:
- 使用
groupby()
方法可以对数据进行分组,然后对每个分组应用聚合函数(如求和、平均值、最大值等)。例如,可以对销售数据按地区分组,然后计算每个地区的总销售额。
- 使用
- 数据合并与连接:
- 类似于 SQL 中的 JOIN 操作,可以将多个 DataFrame 按指定的键合并在一起。例如,可以将员工信息表和员工绩效表按员工 ID 合并。
1.3. Pandas 的应用场景
- 数据分析:用于对数据进行统计分析,如计算描述性统计量(均值、中位数、标准差等)。
- 数据可视化:虽然 Pandas 本身不是专门的可视化工具,但它可以与 Matplotlib、Seaborn 等可视化库结合,方便地生成图表。
- 机器学习数据准备:在机器学习项目中,Pandas 常用于数据预处理,如特征工程、数据标准化等,为模型训练提供干净的数据。
二、Series()函数
2.1 创建Series对象的方式
- 1、直接创建Series空对象
- 2、使用ndarray创建Series对象
- 3、用字典创建Series对象
案例一:创建Series空对象
import pandas as pd
s = pd.Series()
print (s)
Series([], dtype: object)
案例二:使用ndarray创建Series对象
import pandas as pd
import numpy as np
arr = np.array([1,2,3,4,5])
s = pd.Series(arr)
print(s)
0 1
1 2
2 3
3 4
4 5
dtype: int32
案例三:用字典创建Series对象
import pandas as pd
import numpy as np
data = {"name": ["John", "Anna", "Peter", "Linda"]}
s = pd.Series(data)
print(s)
name [John, Anna, Peter, Linda]
dtype: object
2.2 访问Series对象的数据
import pandas as pd
import numpy as np
data = {"name": ["John", "Anna", "Peter", "Linda"],"age": [20, 21, 19, 18]}
s = pd.Series(data)
print(s["name"])
print(s[1])
2.3 遍历Series对象
import pandas as pd
data = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])
for i in data:
print(i)
# 1
# 2
# 3
# 4
# 5
# 使用item()函数
for i in data.items():
print(i)
# ('a', 1)
# ('b', 2)
# ('c', 3)
# ('d', 4)
# ('e', 5)
# 使用values
for i in data.values:
print(i)
# 1
# 2
# 3
# 4
# 5
# 使用index
for i in data.index:
print(i)
# a
# b
# c
# d
# e
2.4 常用的方法
isnull() 和 notnull()
isnull() 和 notnull() 用于检测 Series、DataFrame 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少
- isnull():如果为值不存在或者缺失,则返回 True
- notnull():如果值不存在或者缺失,则返回 False
案例
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [None, 5, 6], 'C': [7, None, 9]})
print(df.isnull())
print(df.notnull())
运行结果:
三、DataFrame
DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:
Dataframe和Series的关系:
在 Pandas 中,DataFrame
的每一行或每一列都是一个 Series
。
DataFrame
是一个二维表格,可以看作是由多个 Series
组成的。
如何区分行和列的 Series
:
列的 Series
:
- 标签是行索引。
- 值是该列的所有行数据。
行的Series:
- 标签是列名。
- 值是该行的所有列数据。
3.1 创建 DataFrame 对象
创建 DataFrame 对象的方式:
- 列表
- 字典
- Series
- Numpy ndarrays
- 另一个 DataFrame
3.1.1 创建 DataFrame 空对象
import pandas as pd
# 创建空DataFrame 对象
df = pd.DataFrame()
print(df)
3.1.2 列表嵌套字典创建 DataFrame 对象
如果缺失元素,则用NaN代替缺失值
def list():
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
print(pd.DataFrame(data))
运行上面这个函数,由于第0行缺少一个值,则用NaN代替
3.1.3 字典嵌套列表创建 DataFrame 对象
def zidian():
data = {'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]}
print(pd.DataFrame(data))
运行结果如图:
3.1.4 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)
运行结果:
案例二
def zidians():
dic = {"nane": pd.Series([1, 2, 3],index=['a','b','c']), "age": pd.Series([4, 5, 6])}
print(pd.DataFrame(dic))
运行结果:
3.2 列索引操作
DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作
3.2.1选取数据
# 使用pd.Series()创建Series对象会将索引赋值给[0,1,2],所以打印为NaN
# 解决方式:使用pd.Series()创建Series对象时,将索引赋值给Series对象的name属性,即可解决
df = pd.DataFrame({"name":pd.Series(["张三","李四","王五"]), "age":np.arange(3)},index=["a","b","c"])
#解决方法:"name":pd.Series(["张三","李四","王五"],index=["a","b","c")
print(df)
'''
name age
a NaN 0
b NaN 1
c NaN 2
'''
df = pd.DataFrame({"name": ["张三", "李四", "王五"], "age": np.arange(3)}, index=["a", "b", "c"])
print(df)
'''
name age
a 张三 0
b 李四 1
c 王五 2
'''
3.2.2 添加数据
1、添加一个空列
data = {
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
}
df = pd.DataFrame(data)
df["D"] = None
print(df)
2、添加新列,直接赋值添加
df = pd.DataFrame({'name': ['Tom', 'Nick', 'John'], 'age': [20, 21, 19]})
df['city'] = ['Beijing', 'Shanghai', 'Guangzhou']
print(df)
3、通过assign方法添加新列
df = pd.DataFrame({'one': [1, 2, 3], 'two': [2, 4, 6]})
df1 = df.assign(three = df['one'] + df['two']).assign(four = [100,200,300])
print(df1)
4、在指定的位置插入新列
使用insert方法在指定位置插入新列,参数:
- loc: 插入位置的列索引。
- column: 新列的名称。
- value: 要插入的 Series。
data = {
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
}
df = pd.DataFrame(data)
df.insert(loc=1,column="D",value=[10,20,30])
print(df)
3.2.3 修改数据
案例1:修改列的值
data = {
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
}
df = pd.DataFrame(data)
df["B"] = [666,777,888]
print(df)
# 广播
df["C"] = 100
print(df)
案例2:修改列名
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'])
print(df)
# A B C D
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
df.columns = ['a','b','c','d']
print(df)
# a b c d
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
案例3:使用 rename 方法修改列名(在案例二的基础上)
df1 = df.rename(columns={'a':'A','b':'B'})
print(df1)
# A B c d
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
案例4:使用astype()修改列的数据类型
# 修改数据类型 astype()
data = {'A':[1,2,3],
'B':[4,5,6],
'C':[7,8,9]
}
df = pd.DataFrame(data)
print(df.dtypes)
df['A'] = df['A'].astype(float)
print(df.dtypes)