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

相关推荐
云空35 分钟前
《解锁 Python 数据分析的强大力量》
python·数据挖掘·数据分析
迷失蒲公英43 分钟前
XML与Go结构互转实现(序列化及反序列化)
xml·开发语言·golang
测试盐1 小时前
c++编译过程初识
开发语言·c++
MUTA️1 小时前
专业版pycharm与服务器连接
人工智能·python·深度学习·计算机视觉·pycharm
赖赖赖先生1 小时前
fastadmin 框架 生成qr code 二维码图片,PHP 7.4版本
开发语言·php
xuanfengwuxiang2 小时前
安卓帧率获取
android·python·测试工具·adb·性能优化·pycharm
玉红7772 小时前
R语言的数据类型
开发语言·后端·golang
夜斗(dou)2 小时前
node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常
开发语言·javascript·node.js
觅远2 小时前
python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
开发语言·python·pdf
神雕杨3 小时前
node js 过滤空白行
开发语言·前端·javascript