「数据分析 - Pandas 函数」【数据分析全栈攻略:爬虫+处理+可视化+报告】
- 第 105 篇 -
Date: 2025 - 06 - 05
Author: 郑龙浩/仟墨
Pandas 核心功能详解与示例
文章目录
- Pandas 核心功能详解与示例
- 1. 数据结构基础
- 1.1 Series 创建与操作
- 1.2 DataFrame 创建与操作
- 2. 数据选择与过滤
- 2.1 基本选择方法
- 2.2 布尔索引
- 3. 数据处理与清洗
- 3.1 缺失值处理
- 3.2 数据转换
- 4. 数据分组与聚合
- 4.1 基本分组操作
- 4.2 聚合函数
- 5. 数据合并与连接
- 5.1 concat 连接
- 5.2 merge 合并
- 6. 时间序列处理
- 7. 文件读写
- 7.1 CSV文件
- 7.2 Excel文件
- 7.3 JSON文件
1. 数据结构基础
1.1 Series 创建与操作
Series
是 Pandas 库中的一维带标签数组,可以简单理解为 Excel 中的单列数据(但功能更强大)。它是构建 DataFrame 的基础组件,也是数据操作的核心对象之一。
创建Series:
pd.Series(data=None, # 数据(列表、字典、标量等)index=None, # 索引(标签)dtype=None, # 数据类型name=None, # Series 名称copy=False, # 是否复制数据fastpath=False # 内部优化参数(通常不直接使用)
)
data
是必须的,其他参数可选。index
用于自定义标签,dtype
控制数据类型,name
用于命名 Series。copy
一般不用改,除非需要避免数据被意外修改。
import pandas as pd
import numpy as np# 从列表创建
arr1 = pd.Series([1, 2, 3]) # 自动生成整数索引
print(arr1)
'''
0 1
1 2
2 3
dtype: int64
'''arr2 = pd.Series([1, 2, 3], index=['a', 'b', 'c']) # 自定义索引
print(arr2)
'''
a 1
b 2
c 3
dtype: int64
'''arr3 = pd.Series([1, 2, 3], dtype=float) # 指定float类型
print(arr3)
'''
0 1.0
1 2.0
2 3.0
dtype: float64
'''# 从字典创建(自动使用字典键作为索引)
arr4 = pd.Series({'a': 1, 'b': 2, 'c': 3})
print(arr4)
'''
a 1
b 2
c 3
dtype: int64
'''data = [10, 20, 30]
idx = ['A', 'B', 'C']
arr5 = pd.Series(data=data, index=idx, name='名字')
print(arr5)
'''
A 10
B 20
C 30
Name: 名字, dtype: int64
'''
Series操作:
import pandas as pd
import numpy as np
#
# # 从列表创建
# arr1 = pd.Series([1, 2, 3]) # 自动生成整数索引
# print(arr1)
# '''
# 0 1
# 1 2
# 2 3
# dtype: int64
# '''
#
# arr2 = pd.Series([1, 2, 3], index=['a', 'b', 'c']) # 自定义索引
# print(arr2)
# '''
# a 1
# b 2
# c 3
# dtype: int64
# '''
#
# arr3 = pd.Series([1, 2, 3], dtype=float) # 指定float类型
# print(arr3)
# '''
# 0 1.0
# 1 2.0
# 2 3.0
# dtype: float64
# '''
#
# # 从字典创建(自动使用字典键作为索引)
# arr4 = pd.Series({'a': 1, 'b': 2, 'c': 3})
# print(arr4)
# '''
# a 1
# b 2
# c 3
# dtype: int64
# '''data = [10, 20, 30]
idx = ['A', 'B', 'C']
arr5 = pd.Series(data=data, index=idx, name='名字')
print(arr5)
'''
A 10
B 20
C 30
Name: 名字, dtype: int64
'''# 索引访问某个元素
print(arr5['B']) # 20# 向量化运算
print(arr5 * 2) # 所有元素 * 2
'''
A 20
B 40
C 60
Name: 名字, dtype: int64
'''# 布尔索引
print(arr5[arr5 > 15]) # 取出 arr5 中,大于15的元素
'''
B 20
C 30
Name: 名字, dtype: int64
'''
1.2 DataFrame 创建与操作
DataFrame
是 Pandas 库中最核心的二维表格型数据结构,相当于 Python 中的"电子表格"或"SQL表"。它的主要作用是为数据分析和处理提供高效灵活的工具,以下是其核心作用和特点
创建DataFrame:
import pandas as pd
import numpy as np# 从字典创建
df1 = pd.DataFrame({'A': 1.0,'B': pd.Timestamp('2025-06-05'),'C': pd.Series(1, index=list(range(4))),'D': np.array([3] * 4),'E': pd.Categorical(["test", "train", "test", "train"]),'F': 'aaa'
})
print(df1)
"""A B C D E F
0 1.0 2025-06-05 1 3 test aaa
1 1.0 2025-06-05 1 3 train aaa
2 1.0 2025-06-05 1 3 test aaa
3 1.0 2025-06-05 1 3 train aaa
"""# 从二维数组创建
df2 = pd.DataFrame(np.random.randn(6, 4), columns=list('ABCD'))
print(df2.head(2))
"""A B C D
0 -1.043791 -0.519411 -0.204117 -1.169345
1 -0.386409 0.978335 -0.092777 -1.832369
"""
DataFrame操作:
# 查看前几行
print(df2.head(2))# 查看统计信息
print(df2.describe())
"""A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.073711 -0.431125 -0.687758 -0.233103
std 0.843157 0.922818 0.779887 0.973118
min -0.861849 -2.104569 -1.509059 -1.135632
25% -0.611510 -0.600794 -1.368714 -1.006602
50% 0.022072 -0.228039 -0.767252 -0.386671
75% 0.658444 0.041933 -0.034326 0.461706
max 1.212112 0.567020 0.276232 1.491390
"""# 转置
print(df2.T)
2. 数据选择与过滤
2.1 基本选择方法
# 选择列
print(df2['A']) # 选择单列
print(df2[['A', 'C']]) # 选择多列# 使用loc按标签选择
print(df2.loc[0:3, ['A', 'B']])
"""A B
0 0.469112 -0.282863
1 1.212112 -0.173215
2 -0.861849 -2.104569
3 0.721555 -0.706771
"""# 使用iloc按位置选择
print(df2.iloc[1:3, 0:2])
"""A B
1 1.212112 -0.173215
2 -0.861849 -2.104569
"""
2.2 布尔索引
# 简单条件过滤
print(df2[df2['A'] > 0])
"""A B C D
0 0.469112 -0.282863 -1.509059 -1.135632
1 1.212112 -0.173215 0.119209 -1.044236
3 0.721555 -0.706771 -1.039575 0.271860
5 0.404705 0.577046 -1.715002 -1.039268
"""# 多条件组合
print(df2[(df2['A'] > 0) & (df2['B'] < 0)])
"""A B C D
0 0.469112 -0.282863 -1.509059 -1.135632
1 1.212112 -0.173215 0.119209 -1.044236
3 0.721555 -0.706771 -1.039575 0.271860
"""
3. 数据处理与清洗
3.1 缺失值处理
# 创建含缺失值的DataFrame
df3 = pd.DataFrame({'A': [1, 2, np.nan, 4],'B': [5, np.nan, np.nan, 8],'C': [10, 20, 30, 40]
})
print(df3)
"""A B C
0 1.0 5.0 10
1 2.0 NaN 20
2 NaN NaN 30
3 4.0 8.0 40
"""# 检测缺失值
print(df3.isnull())
"""A B C
0 False False False
1 False True False
2 True True False
3 False False False
"""# 删除缺失值
print(df3.dropna())
"""A B C
0 1.0 5.0 10
3 4.0 8.0 40
"""# 填充缺失值
print(df3.fillna(value=0))
"""A B C
0 1.0 5.0 10
1 2.0 0.0 20
2 0.0 0.0 30
3 4.0 8.0 40
"""
3.2 数据转换
# 应用函数
print(df3['A'].apply(lambda x: x**2 if not pd.isnull(x) else 0))
"""
0 1.0
1 4.0
2 0.0
3 16.0
Name: A, dtype: float64
"""# 元素级转换
print(df3.applymap(lambda x: '%.1f' % x if not pd.isnull(x) else 'NaN'))
"""A B C
0 1.0 5.0 10.0
1 2.0 NaN 20.0
2 NaN NaN 30.0
3 4.0 8.0 40.0
"""
4. 数据分组与聚合
4.1 基本分组操作
df4 = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'C': np.random.randn(8),'D': np.random.randn(8)
})
print(df4)
"""A B C D
0 foo one 0.469112 -0.861849
1 bar one -0.282863 -2.104569
2 foo two -1.509059 -0.494929
3 bar three -1.135632 1.071804
4 foo two 1.212112 0.721555
5 bar two -0.173215 -0.706771
6 foo one 0.119209 -1.039575
7 foo three -1.044236 0.271860
"""# 单列分组
grouped = df4.groupby('A')
print(grouped.mean())
"""C D
A
bar -0.530570 -0.579845
foo -0.150572 -0.280588
"""# 多列分组
print(df4.groupby(['A', 'B']).mean())
"""C D
A B
bar one -0.282863 -2.104569three -1.135632 1.071804two -0.173215 -0.706771
foo one 0.294161 -0.950712three -1.044236 0.271860two -0.148473 0.113313
"""
4.2 聚合函数
# 多种聚合函数
print(grouped.agg(['sum', 'mean', 'std']))
"""C D sum mean std sum mean std
A
bar -1.591710 -0.530570 0.526860 -1.739536 -0.579845 1.591985
foo -0.752862 -0.150572 1.113308 -1.402938 -0.280588 0.739965
"""# 不同列应用不同聚合
print(grouped.agg({'C': 'sum', 'D': ['min', 'max']}))
"""C D sum min max
A
bar -1.591710 -2.104569 1.071804
foo -0.752862 -1.039575 0.721555
"""
5. 数据合并与连接
5.1 concat 连接
df5 = pd.DataFrame(np.random.randn(3, 4), columns=['A', 'B', 'C', 'D'])
df6 = pd.DataFrame(np.random.randn(2, 3), columns=['A', 'B', 'C'])# 纵向连接
print(pd.concat([df5, df6]))
"""A B C D
0 1.075770 -0.109050 1.643563 -1.469388
1 0.357021 -0.674600 -1.776904 -0.968914
2 -1.294524 0.413738 0.276662 -0.472035
0 -0.013960 -0.362543 -0.006154 NaN
1 -0.923061 0.895717 0.805244 NaN
"""# 横向连接
print(pd.concat([df5, df6], axis=1))
"""A B C D A B C
0 1.075770 -0.109050 1.643563 -1.469388 -0.013960 -0.362543 -0.006154
1 0.357021 -0.674600 -1.776904 -0.968914 -0.923061 0.895717 0.805244
2 -1.294524 0.413738 0.276662 -0.472035 NaN NaN NaN
"""
5.2 merge 合并
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']
})right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']
})# 内连接
print(pd.merge(left, right, on='key'))
"""key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
"""# 左连接
print(pd.merge(left, right, how='left', on='key'))
"""key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
"""
6. 时间序列处理
# 创建时间序列
date_rng = pd.date_range(start='1/1/2025', end='1/08/2025', freq='D')
df7 = pd.DataFrame(date_rng, columns=['date'])
df7['data'] = np.random.randint(0,100,size=(len(date_rng)))
print(df7)
"""date data
0 2025-01-01 95
1 2025-01-02 27
2 2025-01-03 63
3 2025-01-04 60
4 2025-01-05 49
5 2025-01-06 42
6 2025-01-07 96
7 2025-01-08 99
"""# 重采样
df7.set_index('date', inplace=True)
print(df7.resample('3D').mean())
"""data
date
2025-01-01 61.666667
2025-01-04 50.333333
2025-01-07 97.500000
"""
7. 文件读写
7.1 CSV文件
# 写入CSV
df7.to_csv('sample.csv')# 读取CSV
df_read = pd.read_csv('sample.csv')
print(df_read.head())
"""date data
0 2025-01-01 95
1 2025-01-02 27
2 2025-01-03 63
3 2025-01-04 60
4 2025-01-05 49
"""
7.2 Excel文件
# 写入Excel
df7.to_excel('sample.xlsx', sheet_name='Sheet1')# 读取Excel
df_excel = pd.read_excel('sample.xlsx')
print(df_excel.head())
7.3 JSON文件
# 写入JSON
df7.to_json('sample.json')# 读取JSON
df_json = pd.read_json('sample.json')
print(df_json.head())