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

相关推荐
健康平安的活着31 分钟前
java之 junit4单元测试Mockito的使用
java·开发语言·单元测试
WBluuue1 小时前
数学建模:智能优化算法
python·机器学习·数学建模·爬山算法·启发式算法·聚类·模拟退火算法
赴3351 小时前
矿物分类案列 (一)六种方法对数据的填充
人工智能·python·机器学习·分类·数据挖掘·sklearn·矿物分类
大模型真好玩1 小时前
一文深度解析OpenAI近期发布系列大模型:意欲一统大模型江湖?
人工智能·python·mcp
RPA+AI十二工作室2 小时前
亚马逊店铺绩效巡检_影刀RPA源码解读
chrome·python·rpa·影刀
DjangoJason2 小时前
C++ 仿RabbitMQ实现消息队列项目
开发语言·c++·rabbitmq
m0_480502642 小时前
Rust 入门 KV存储HashMap (十七)
java·开发语言·rust
大阳1232 小时前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
小艳加油2 小时前
Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
python·深度学习·机器学习·transformer
YA3333 小时前
java基础(九)sql基础及索引
java·开发语言·sql