Pandas,一个Python办公神器?

微信公众号:愤怒的it男,超多Python技术干货文章。

Pandas库基于NumPy库开发,是一个免费、开源的第三方Python库,与Numpy、Matplotlib并称Python数据分析三剑客。Pandas提供了两种数据结构,分别是Series(一维数组结构)与DataFrame(二维数组结构),这两种数据结构极大地增强的了Pandas的数据分析能力。

一、安装/导入pandas

python 复制代码
# 安装pandas
pip install pandas
# 导入pandas
import pandas as pd

二、导入/导出excel

pandas使用read_excel()方法导入excel文件。

常用参数:

  • io:文件路径
  • sheet_name:指定工作簿
  • names:自定义表头
  • encoding:文件编码方式,如utf-8,gbk等
python 复制代码
>>> df = pd.read_excel('test_in.xlsx', sheet_name='学生成绩')
>>> print(df)
   姓名  语文   数学  英语  物理  化学   生物  政治  历史   地理
0  张三  87   60  91  93  93   72  95  63   80
1  李四  63   86  89  71  69   73  85  61  100
2  王五  88   64  66  90  78   64  68  85   84
3  赵六  88   98  83  90  80   64  98  84   79
4  孙七  66   85  79  80  91   92  72  83   81
5  周八  73   88  77  98  63   78  63  64   94
6  吴九  66   71  60  65  70  100  65  68   87
7  郑十  62  100  63  90  60   70  92  67   70

pandas使用to_excel()方法导出Excel文件。

常用参数:

  • excel_writer:文件路径,不存在会自动生成
  • sheet_name:指定工作簿
  • index:True表示写入行索引,False表示不写入行索引
  • encoding:文件编码方式
python 复制代码
>>> df.to_excel('test_out.xlsx', index=False, sheet_name='学生成绩')

三、创建数据

1、创建Series数据

  • 通过列表创建
python 复制代码
>>> pd.Series([78, 83, 90], index=['语文', '数学', '英语'])
语文    78
数学    83
英语    90
dtype: int64
  • 通过字典创建
python 复制代码
>>> pd.Series({'语文':78, '数学':83, '英语':90})
语文    78
数学    83
英语    90
dtype: int64
  • 通过数值创建
python 复制代码
>>> pd.Series(83, index=['语文', '数学', '英语'])
语文    83
数学    83
英语    83
dtype: int64

2、创建DataFrame数据

  • 通过列表创建
python 复制代码
>>> pd.DataFrame([[78,83,90],[67,89,65],[77,82,91]], index=['张三','李四','王五'], columns=['语文', '数学', '英语'])
    语文  数学  英语
张三  78  83  90
李四  67  89  65
王五  77  82  91
  • 通过字典-列表创建
python 复制代码
>>> pd.DataFrame({'语文':[78,83,90],'数学':[67,89,65],'英语':[77,82,91]}, index=['张三', '李四', '王五'])
    语文  数学  英语
张三  78  67  77
李四  83  89  82
王五  90  65  91
  • 通过列表-字典创建
python 复制代码
>>> pd.DataFrame([{'语文':78,'数学':83,'英语':90},{'语文':67,'数学':89,'英语':65},{'语文':77,'数学':82,'英语':91}], index=['张三', '李四', '王五'])
    语文  数学  英语
张三  78  83  90
李四  67  89  65
王五  77  82  91
  • 通过数值创建
python 复制代码
>>> pd.DataFrame(88, index=['张三','李四','王五'], columns=['语文', '数学', '英语'])
    语文  数学  英语
张三  88  88  88
李四  88  88  88
王五  88  88  88

四、查看数据

1、查看头部和尾部数据

python 复制代码
>>> df = pd.read_excel('test_in.xlsx', sheet_name='学生成绩')
>>> df.head(5)
   姓名  语文  数学  英语  物理  化学  生物  政治  历史   地理
0  张三  87  60  91  93  93  72  95  63   80
1  李四  63  86  89  71  69  73  85  61  100
2  王五  88  64  66  90  78  64  68  85   84
3  赵六  88  98  83  90  80  64  98  84   79
4  孙七  66  85  79  80  91  92  72  83   81
>>> df.tail(5)
   姓名  语文   数学  英语  物理  化学   生物  政治  历史  地理
3  赵六  88   98  83  90  80   64  98  84  79
4  孙七  66   85  79  80  91   92  72  83  81
5  周八  73   88  77  98  63   78  63  64  94
6  吴九  66   71  60  65  70  100  65  68  87
7  郑十  62  100  63  90  60   70  92  67  70

2、查看行和列

python 复制代码
>>> df.index
RangeIndex(start=0, stop=8, step=1)
>>> df.columns
Index(['姓名', '语文', '数学', '英语', '物理', '化学', '生物', '政治', '历史', '地理'], dtype='object')

3、行列数据置换

python 复制代码
>>> df.T
     0    1   2   3   4   5    6    7
姓名  张三   李四  王五  赵六  孙七  周八   吴九   郑十
语文  87   63  88  88  66  73   66   62
数学  60   86  64  98  85  88   71  100
英语  91   89  66  83  79  77   60   63
物理  93   71  90  90  80  98   65   90
化学  93   69  78  80  91  63   70   60
生物  72   73  64  64  92  78  100   70
政治  95   85  68  98  72  63   65   92
历史  63   61  85  84  83  64   68   67
地理  80  100  84  79  81  94   87   70

4、按轴排序数据

python 复制代码
>>> df.sort_index(axis=0, ascending=False)
   姓名  语文   数学  英语  物理  化学   生物  政治  历史   地理
7  郑十  62  100  63  90  60   70  92  67   70
6  吴九  66   71  60  65  70  100  65  68   87
5  周八  73   88  77  98  63   78  63  64   94
4  孙七  66   85  79  80  91   92  72  83   81
3  赵六  88   98  83  90  80   64  98  84   79
2  王五  88   64  66  90  78   64  68  85   84
1  李四  63   86  89  71  69   73  85  61  100
0  张三  87   60  91  93  93   72  95  63   80

5、按值排序数据

python 复制代码
>>> df.sort_values(by='语文')
   姓名  语文   数学  英语  物理  化学   生物  政治  历史   地理
7  郑十  62  100  63  90  60   70  92  67   70
1  李四  63   86  89  71  69   73  85  61  100
4  孙七  66   85  79  80  91   92  72  83   81
6  吴九  66   71  60  65  70  100  65  68   87
5  周八  73   88  77  98  63   78  63  64   94
0  张三  87   60  91  93  93   72  95  63   80
2  王五  88   64  66  90  78   64  68  85   84
3  赵六  88   98  83  90  80   64  98  84   79

五、选择数据

1、通过\[\]选择(传参标签选择列,传参切片:选择行)

python 复制代码
>>> df = pd.read_excel('test_in.xlsx', sheet_name='学生成绩')
>>> df['英语']
0    91
1    89
2    66
3    83
4    79
5    77
6    60
7    63
Name: 英语, dtype: int64
>>> df[2:5]
   姓名  语文  数学  英语  物理  化学  生物  政治  历史  地理
2  王五  88  64  66  90  78  64  68  85  84
3  赵六  88  98  83  90  80  64  98  84  79
4  孙七  66  85  79  80  91  92  72  83  81

2、通过标签选择(loc和at)

python 复制代码
>>> df.loc[2:5,['物理','化学']]
   物理  化学
2  90  78
3  90  80
4  80  91
5  98  63
>>> df.loc[[2,6],['物理','化学']]
   物理  化学
2  90  78
6  65  70
>>> df.at[2,'物理']
90

3、通过索引选择(iloc和iat)

python 复制代码
>>> df.iloc[2:5,[4,5]]
   物理  化学
2  90  78
3  90  80
4  80  91
>>> df.iloc[[2,6],[4,5]]
   物理  化学
2  90  78
6  65  70
>>> df.iat[2,4]
90

六、合并操作

python 复制代码
>>> df = pd.read_excel('test_in.xlsx', sheet_name='学生成绩')
>>> df1 = df[2:4]
>>> df1
   姓名  语文  数学  英语  物理  化学  生物  政治  历史  地理
2  王五  88  64  66  90  78  64  68  85  84
3  赵六  88  98  83  90  80  64  98  84  79
>>> df2 = df[5:8]
>>> df2
   姓名  语文   数学  英语  物理  化学   生物  政治  历史  地理
5  周八  73   88  77  98  63   78  63  64  94
6  吴九  66   71  60  65  70  100  65  68  87
7  郑十  62  100  63  90  60   70  92  67  70
>>> pd.concat([df1,df2])
   姓名  语文   数学  英语  物理  化学   生物  政治  历史  地理
2  王五  88   64  66  90  78   64  68  85  84
3  赵六  88   98  83  90  80   64  98  84  79
5  周八  73   88  77  98  63   78  63  64  94
6  吴九  66   71  60  65  70  100  65  68  87
7  郑十  62  100  63  90  60   70  92  67  70

七、连接操作

pandas使用merge()进行连接操作。

常用参数:

  • left:左DataFrame
  • right:右DataFrame
  • how:有left、right、outer、inner、cross五种,默认为inner
  • on:连接键
python 复制代码
>>> left = pd.DataFrame(
...     {
...         "key1": ["K0", "K0", "K1", "K2"],
...         "key2": ["K0", "K1", "K0", "K1"],
...         "A": ["A0", "A1", "A2", "A3"],
...         "B": ["B0", "B1", "B2", "B3"],
...     }
... )
>>> right = pd.DataFrame(
...     {
...         "key1": ["K0", "K1", "K1", "K2"],
...         "key2": ["K0", "K0", "K0", "K0"],
...         "C": ["C0", "C1", "C2", "C3"],
...         "D": ["D0", "D1", "D2", "D3"],
...     }
... )

1、left方式连接,只使用左DataFrame中的键

python 复制代码
>>> pd.merge(left, right, how="left", on=["key1", "key2"])
  key1 key2   A   B    C    D
0   K0   K0  A0  B0   C0   D0
1   K0   K1  A1  B1  NaN  NaN
2   K1   K0  A2  B2   C1   D1
3   K1   K0  A2  B2   C2   D2
4   K2   K1  A3  B3  NaN  NaN

2、right方式连接,只使用右DataFrame中的键

python 复制代码
>>> pd.merge(left, right, how="right", on=["key1", "key2"])
  key1 key2    A    B   C   D
0   K0   K0   A0   B0  C0  D0
1   K1   K0   A2   B2  C1  D1
2   K1   K0   A2   B2  C2  D2
3   K2   K0  NaN  NaN  C3  D3

3、outer方式连接,使用两个DataFrame的键并集

python 复制代码
>>> pd.merge(left, right, how="outer", on=["key1", "key2"])
  key1 key2    A    B    C    D
0   K0   K0   A0   B0   C0   D0
1   K0   K1   A1   B1  NaN  NaN
2   K1   K0   A2   B2   C1   D1
3   K1   K0   A2   B2   C2   D2
4   K2   K1   A3   B3  NaN  NaN
5   K2   K0  NaN  NaN   C3   D3

4、inner方式连接,使用两个DataFrame的键交集

python 复制代码
>>> pd.merge(left, right, how="inner", on=["key1", "key2"])
  key1 key2   A   B   C   D
0   K0   K0  A0  B0  C0  D0
1   K1   K0  A2  B2  C1  D1
2   K1   K0  A2  B2  C2  D2

八、分组操作

python 复制代码
>>> df = pd.read_excel('test_in.xlsx', sheet_name='学生成绩')
>>> df
   姓名  语文   数学  英语  物理  化学   生物  政治  历史   地理
0  张三  87   60  91  93  93   72  95  63   80
1  李四  63   86  89  71  69   73  85  61  100
2  王五  88   64  66  90  78   64  68  85   84
3  赵六  88   98  83  90  80   64  98  84   79
4  孙七  66   85  79  80  91   92  72  83   81
5  周八  73   88  77  98  63   78  63  64   94
6  吴九  66   71  60  65  70  100  65  68   87
7  郑十  62  100  63  90  60   70  92  67   70
>>> df['年级']=['高二','高三','高二','高三','高一','高一','高二','高三']
>>> df
   姓名  语文   数学  英语  物理  化学   生物  政治  历史   地理  年级
0  张三  87   60  91  93  93   72  95  63   80  高二
1  李四  63   86  89  71  69   73  85  61  100  高三
2  王五  88   64  66  90  78   64  68  85   84  高二
3  赵六  88   98  83  90  80   64  98  84   79  高三
4  孙七  66   85  79  80  91   92  72  83   81  高一
5  周八  73   88  77  98  63   78  63  64   94  高一
6  吴九  66   71  60  65  70  100  65  68   87  高二
7  郑十  62  100  63  90  60   70  92  67   70  高三
>>> df.groupby('年级')[['物理','化学']].mean()
           物理         化学
年级
高一  89.000000  77.000000
高三  83.666667  69.666667
高二  82.666667  80.333333

九、分类操作

通过astype()将一列设为category类型数据。

python 复制代码
>>> df = pd.read_excel('test_in.xlsx', sheet_name='学生成绩')
>>> df['年级']=['高二','高三','高二','高三','高一','高一','高二','高三']
>>> df['年级'] = df['年级'].astype('category')
>>> df['年级']
0    高二
1    高三
2    高二
3    高三
4    高一
5    高一
6    高二
7    高三
Name: 年级, dtype: category
Categories (3, object): ['高一', '高三', '高二']

通过cat.set_categories()更新类别数据同时添加缺少的类别。

python 复制代码
>>> df['年级'] = df['年级'].cat.set_categories(['高一', '高三', '高二', '高四'])
>>> df['年级']
0    高二
1    高三
2    高二
3    高三
4    高一
5    高一
6    高二
7    高三
Name: 年级, dtype: category
Categories (4, object): ['高一', '高三', '高二', '高四']

通过groupby()分组类别并统计个数,observed=False表示显示空类别

python 复制代码
>>> df.groupby('年级',observed=False).size()
年级
高一    2
高三    3
高二    3
高四    0
dtype: int64

微信公众号:愤怒的it男,超多Python技术干货文章。

相关推荐
AI工具人PM产品经理4 分钟前
CSDN 自动发布全流程实战:从 CKEditor HTML 注入到创作页就地发布
python
_Jimmy_8 分钟前
Tool Calling 与 Function Calling 区别
人工智能·python·langchain
2zcode13 分钟前
项目文档:基于MATLAB最小二乘支持向量机的睡眠分期智能监测系统设计与实现
开发语言·支持向量机·matlab
twcc_come19 分钟前
安全策略配置实验报告
开发语言·php
逆风飞翔的小叔22 分钟前
【Python基础】Python 流程控制语句使用详解
python·python 流程控制语句·python 流程控制·python 流程控制语句使用·python 流程控制语句详解
2601_9638702232 分钟前
基于Python的晋江文学城热门作品数据分析与可视化
开发语言·python·数据分析
llwszx36 分钟前
【Java/Go后端手撸原生Agent(第七篇):Token预算管理 + 滑动窗口上下文裁剪】
java·后端·python·agent开发·上下文工程·上下文裁剪·滑动窗口裁剪
我怎么又饿了呀40 分钟前
DataWhale—量化金融(task8 最大回撤 和 仓位管理)
python·金融·量化
Black_Rock_br1 小时前
打通 PyTorch Monarch 与 ROCm:单 Controller 架构的异构算力实战
人工智能·pytorch·python·开源
其实防守也摸鱼1 小时前
Kimi K3深度测评:长文本之外的真实力
运维·开发语言·网络·人工智能·python·学习·安全