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

相关推荐
IT 行者4 小时前
Web逆向工程AI工具:JSHook MCP,80+专业工具让Claude变JS逆向大师
开发语言·javascript·ecmascript·逆向
程序员 沐阳5 小时前
JavaScript 内存与引用:深究深浅拷贝、垃圾回收与 WeakMap/WeakSet
开发语言·javascript·ecmascript
Mr_Xuhhh6 小时前
Java泛型进阶:从基础到高级特性完全指南
开发语言·windows·python
He1955016 小时前
wordpress搭建块
开发语言·wordpress·古腾堡·wordpress块
老天文学家了7 小时前
蓝桥杯备战Python
开发语言·python
赫瑞7 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
初夏睡觉7 小时前
c++1.3(变量与常量,简单数学运算详解),草稿公放
开发语言·c++
升职佳兴7 小时前
C盘爆满自救:3步无损迁移应用数据到E盘(含回滚)
c语言·开发语言
ID_180079054737 小时前
除了 Python,还有哪些语言可以解析 JSON 数据?
开发语言·python·json
周末也要写八哥8 小时前
多进程和多线程的特点和区别
java·开发语言·jvm