python.pandas.day17
一、基础
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)和列组成,函数:
4.1 创建 Series 对象的方式
4.1.1 创建 Series 空对象
import pandas as pd
series_data = pd.Series()
print(series_data)
直接赋值创建Series 对象
import pandas as pd
series_data = pd.Series([12,3,4,4])
print(series_data)
4.1.2 ndarray 创建 Series 对象
import pandas as pd
import numpy as np
series_data = pd.Series(np.arange(6))
print(series_data)
4.1.3 字典创建 Series 对象
使用字典创建对象,会以键作为标签
import pandas as pd
import numpy as np
series_data = pd.Series({'name':'zhangsan','age':23})
print(series_data)
4.2 访问 Series 数据
import pandas as pd
import numpy as np
data = np.arange(6)
series = pd.Series(data)
#一样以索引来访问数据,只不过这里的索引变为标签
for i in series:
print(i)
#这里键变为标签
series2 = pd.Series({'name':'li','age':20})
print(series2['name'])
print(series2['age'])
4.3 Series遍历
使用 items()
import pandas as pd
import numpy as np
#index自己添加标签
series = pd.Series(np.arange(3), index=['a', 'b', 'c'])
#通过items遍历标签,还有值
for col_index,col_value in series.items():
print(f'index:{col_index}, value:{col_value}')
使用 index 属性,value
#index自己添加标签
series = pd.Series(np.arange(3), index=['a', 'b', 'c'])
for index in series.index:
print(index, series[index])
#value
for value in series.values:
print(value)
4.4 Series 常用方法
4.4.1 isnull() 和 notnull()
isnull() 和 notnull() 用于检测 Series、DataFrame 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少
-
isnull():如果为值不存在或者缺失,则返回 True
-
notnull():如果值不存在或者缺失,则返回 False
-
series = pd.Series([1,2,3,4,5 , None]) print(series.isnull()) print(series.notnull()) #过滤掉缺失值 print(series[series.notnull()])
5、DataFrame
- DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:
<img src="./media/image-20241016171536818.png"/>
- DataFrame 的每一行或列数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列或行标签
- 同 Series 一样,DataFrame 自带行标签索引,默认为“隐式索引”即从 0 开始依次递增,行标签与 DataFrame 中的数据项一一对应当然你也可以用“显式索引”的方式来设置行标签
- DataFrame 构造方法如下:
-
函数名 参数 pd.DataFrame( data, index, columns, dtype, copy) data:一组数据(ndarray、series, map, lists, dict 等类型) index:索引值,或者可以称为行标签 columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) dtype:数据类型 copy:默认为 False,表示复制数据 data
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
print(df)
5.1 创建 DataFrame 对象
**创建 DataFrame 对象的方式:**
- 列表
- 字典
- Series
- Numpy ndarrays
- 另一个 DataFrame
5.1.2 列表嵌套字典创建 DataFrame 对象
案例:如果其中某个元素值缺失,也就是字典的 key 无法找到对应的 value,将使用 NaN 代替。
import pandas as pd
import numpy as np
data = [{'name':"zhangsan", 'age':23},{'name':'lis','age':23,'gender':'nan'}]
df = pd.DataFrame(data)
print(df)
创建Dataframe,指定列
data = [{'name': "张三", 'age': 18},{'name': "小红", 'gender': "男", 'age': 19}]
#指定的列标签
result = pd.DataFrame(data=data,columns=['name','age'])
result1 = pd.DataFrame(data=data,columns=['name','gender'])
print(result)
print(result1)
5.1.3 字典嵌套列表创建 DataFrame 对象
data = {'name':['zhangsan','lisi','wangwu'],'age':[23,23,23]}
df = pd.DataFrame(data)
print(df)
5.2 列索引操作
DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作
5.2.1 选取数据
data = {'name':['zhangsan','lisi','wangwu'],'age':[23,23,23]}
df = pd.DataFrame(data)
print(df)
#以列标签选取
print(df['name'])
print(df['age'])
5.2.2 添加数据
案例1:添加一列空列
注意要添加的数据要与行保持一致
data = {'name':['zhangsan','lisi','wangwu'],'age':[23,23,23]}
df = pd.DataFrame(data)
print(df)
#以列标签选取
print(df['name'])
print(df['age'])
df['gender'] = ['male','female','male']
print(df)
在指定的位置插入新列
使用insert方法在指定位置插入新列,参数:
-
loc: 插入位置的列索引。
-
column: 新列的名称。
-
value: 要插入的 Series
data = {'name':['zhangsan','lisi','wangwu'],'age':[23,23,23]}
df = pd.DataFrame(data)
print(df)
#列索引为整数不是标签名
df.insert(1,'gender',['male','female','male',])
print(df)
5.2.3 修改数据
案例1:修改列的值
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)
修改列名
# 修改数据
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.columns=['A', 'B']
print(result)
修改列的数据类型
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.columns=['A', 'B']
result['A'].astype(np.float64)
print(result['A'].dtypes)
5.2.4 删除数据
. 通过drop方法删除 DataFrame 中的数据,默认情况下,drop() 不会修改原 DataFrame,而是返回一个新的 DataFrame。
1. **labels**:
- **类型**:单个标签或列表。
- **描述**:要删除的行或列的标签。如果 axis=0,则 labels 表示行标签;如果 axis=1,则 labels 表示列标签。
2. **axis**:
- **类型**:整数或字符串,默认为 0。
- **描述**:指定删除的方向。axis=0 或 axis='index' 表示删除行,axis=1 或 axis='columns' 表示删除列。
3. index:
- **类型**:单个标签或列表,默认为 None。
- **描述**:要删除的行的标签。如果指定,则忽略 labels 参数。
4. columns:
- **类型**:单个标签或列表,默认为 None。
- **描述**:要删除的列的标签。如果指定,则忽略 labels 参数。
5. level:
- **类型**:整数或级别名称,默认为 None。
- **描述**:用于多级索引(MultiIndex),指定要删除的级别。
6. **inplace**:
- **类型**:布尔值,默认为 False。
- **描述**:如果为 True,则直接修改原 DataFrame,而不是返回一个新的 DataFrame。
7. errors:
- **类型**:字符串,默认为 'raise'。
- **描述**:指定如何处理不存在的标签。'raise' 表示抛出错误,'ignore' 表示忽略错误。
**案例1:**删除列
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.drop('two', axis='columns', inplace=True)
print(result)
案例2:删除行
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.drop('a', axis='index', inplace=True)
print(result)
5.3 行索引操作
5.3.1 loc 选取数据
df.loc[] 只能使用标签索引,不能使用整数索引。当通过标签索引的切片方式来筛选数据时,它的取值前闭后闭,也就是只包括边界值标签(开始和结束)
loc方法返回的数据类型:
1.如果选择单行或单列,返回的数据类型为Series
2.选择多行或多列,返回的数据类型为DataFrame
3.选择单个元素(某行某列对应的值),返回的数据类型为该元素的原始数据类型(如整数、浮点数等)。
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.loc['a'])
print(result.loc['b':'c'])
5.3.2 iloc 选取数据
iloc 方法用于基于位置(integer-location based)的索引,即通过行和列的整数位置来选择数据。
参数:
-
row_indexer:行位置或布尔数组。
-
column_indexer:列位置或布尔数组
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.iloc[0]) # 选择第 0 行的数据
print(result.iloc[0:2]) # 选择第 0 到 1 行的数据
print(result.iloc[0, 1]) # 选择第 0 行,第 1 列的元素
print(result.iloc[[0, 1], [0, 1]]) # 选择第 0 和 1 行,第 0 和 1 列的数据
5.3.4 添加数据行
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)
concat拼接
**参数**:
**objs**: 要连接的 DataFrame 或 Series 对象的列表或字典。
**axis**: 指定连接的轴,0 或 'index' 表示按行连接,1 或 'columns' 表示按列连接。
**join**: 指定连接方式,'outer' 表示并集(默认),'inner' 表示交集。
**ignore_index**: 如果为 True,则忽略原始索引并生成新的索引。
keys: 用于在连接结果中创建层次化索引。
levels: 指定层次化索引的级别。
names: 指定层次化索引的名称。
verify_integrity: 如果为 True,则在连接时检查是否有重复索引。
sort: 如果为 True,则在连接时对列进行排序。
copy: 如果为 True,则复制数据。
案例1:按行连接(垂直堆叠
# 创建两个示例 DataFrame
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
df2 = pd.DataFrame({
'A': [7, 8, 9],
'B': [10, 11, 12]
})
# 按行连接 df1 和 df2
result = pd.concat([df1, df2], axis=0)
print(result)
按列连接(水平堆叠)
# 创建两个示例 DataFrame
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
df2 = pd.DataFrame({
'C': [7, 8, 9],
'D': [10, 11, 12]
})
# 按列连接 df1 和 df2
result = pd.concat([df1, df2], axis=1)
print(result)
使用 ignore_index
# 创建两个示例 DataFrame
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
df2 = pd.DataFrame({
'A': [7, 8, 9],
'B': [10, 11, 12]
})
# 按行连接 df1 和 df2,并忽略原始索引
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
案例4:使用 join='inner',按行合并
# 创建两个示例 DataFrame
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
}, index=[0, 1, 2])
df2 = pd.DataFrame({
'A': [7, 8, 9],
'B': [10, 11, 12],
'D': [13, 14, 15]
}, index=[1, 2, 3])
# 按行合并,只匹配column相同的列,行被堆叠
result = pd.concat([df1, df2], axis=0, join='inner')
print(result)
# 按列合并,只匹配index相同的行,列被堆叠
result = pd.concat([df1, df2], axis=1, join='inner')
print(result)
二、函数
1、常用的统计学函数
函数名称 | 描述说明 |
---|---|
count() | 统计某个非空值的数量 |
sum() | 求和 |
mean() | 求均值 |
median() | 求中位数 |
std() | 求标准差 |
min() | 求最小值 |
max() | 求最大值 |
abs() | 求绝对值 |
prod() | 求所有数值的乘积 |
# 创建一个示例 DataFrame
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
# 计算每列的均值
mean_values = df.mean()
print(mean_values)
# 计算每列的中位数
median_values = df.median()
print(median_values)
#计算每列的方差
var_values = df.var()
print(var_values)
# 计算每列的标准差
std_values = df.std()
print(std_values)
# 计算每列的最小值
min_values = df.min()
print("最小值:")
print(min_values)
# 计算每列的最大值
max_values = df.max()
print("最大值:")
print(max_values)
# 计算每列的总和
sum_values = df.sum()
print(sum_values)
# 计算每列的非空值数量
count_values = df.count()
print(count_values)
2、重置索引
重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行、列标签与 DataFrame 中的数据逐一匹配。通过重置索引操作,您可以完成对现有数据的重新排序。如果重置的索引标签在原 DataFrame 中不存在,那么该标签对应的元素值将全部填充为 NaN。
reindex
reindex() 方法用于重新索引 DataFrame 或 Series 对象。重新索引意味着根据新的索引标签重新排列数据,并填充缺失值。如果重置的索引标签在原 DataFrame 中不存在,那么该标签对应的元素值将全部填充为 NaN。