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技术干货文章。

相关推荐
麻雀飞吧44 分钟前
零基础选量化工具,先把问题说清楚
人工智能·python
段一凡-华北理工大学1 小时前
AI推动工业智能化转型~系列文章20:工业 AI 平台架构:云-边-端协同的技术体系
人工智能·python·架构·工业平台·云-边协同
CodeBlog-star1 小时前
Harness Engineering:Pi Agent 架构深度解析
人工智能·python·架构·harness工程
简不变1 小时前
将components下的文件夹复制到别一个文件夹下,并重新生成CMakelist.txt文件
python
库玛西2 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
AC赳赳老秦2 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
databook2 小时前
如何对稀疏数据的场景进行分析
python·数据挖掘·数据分析
liulilittle2 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
朋克洛德的码农2 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang
Java&Develop3 小时前
DeltaFStation 宝塔 Linux 部署教程
python