微信公众号:愤怒的it男,超多Python技术干货文章。
Pandas库基于NumPy库开发,是一个免费、开源的第三方Python库,与Numpy、Matplotlib并称Python数据分析三剑客。Pandas提供了两种数据结构,分别是Series(一维数组结构)与DataFrame(二维数组结构),这两种数据结构极大地增强的了Pandas的数据分析能力。
一、安装/导入pandas
# 安装pandas
pip install pandas
# 导入pandas
import pandas as pd
二、导入/导出excel
pandas使用read_excel()方法导入excel文件。
常用参数:
- io:文件路径
- sheet_name:指定工作簿
- names:自定义表头
- encoding:文件编码方式,如utf-8,gbk等
>>> 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:文件编码方式
>>> df.to_excel('test_out.xlsx', index=False, sheet_name='学生成绩')
三、创建数据
1、创建Series数据
- 通过列表创建
>>> pd.Series([78, 83, 90], index=['语文', '数学', '英语'])
语文 78
数学 83
英语 90
dtype: int64
- 通过字典创建
>>> pd.Series({'语文':78, '数学':83, '英语':90})
语文 78
数学 83
英语 90
dtype: int64
- 通过数值创建
>>> pd.Series(83, index=['语文', '数学', '英语'])
语文 83
数学 83
英语 83
dtype: int64
2、创建DataFrame数据
- 通过列表创建
>>> pd.DataFrame([[78,83,90],[67,89,65],[77,82,91]], index=['张三','李四','王五'], columns=['语文', '数学', '英语'])
语文 数学 英语
张三 78 83 90
李四 67 89 65
王五 77 82 91
- 通过字典-列表创建
>>> pd.DataFrame({'语文':[78,83,90],'数学':[67,89,65],'英语':[77,82,91]}, index=['张三', '李四', '王五'])
语文 数学 英语
张三 78 67 77
李四 83 89 82
王五 90 65 91
- 通过列表-字典创建
>>> pd.DataFrame([{'语文':78,'数学':83,'英语':90},{'语文':67,'数学':89,'英语':65},{'语文':77,'数学':82,'英语':91}], index=['张三', '李四', '王五'])
语文 数学 英语
张三 78 83 90
李四 67 89 65
王五 77 82 91
- 通过数值创建
>>> pd.DataFrame(88, index=['张三','李四','王五'], columns=['语文', '数学', '英语'])
语文 数学 英语
张三 88 88 88
李四 88 88 88
王五 88 88 88
四、查看数据
1、查看头部和尾部数据
>>> 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、查看行和列
>>> df.index
RangeIndex(start=0, stop=8, step=1)
>>> df.columns
Index(['姓名', '语文', '数学', '英语', '物理', '化学', '生物', '政治', '历史', '地理'], dtype='object')
3、行列数据置换
>>> 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、按轴排序数据
>>> 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、按值排序数据
>>> 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、通过[]选择(传参标签选择列,传参切片:选择行)
>>> 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)
>>> 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)
>>> 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
六、合并操作
>>> 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:连接键
>>> 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中的键
>>> 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中的键
>>> 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的键并集
>>> 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的键交集
>>> 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
八、分组操作
>>> 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类型数据。
>>> 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()更新类别数据同时添加缺少的类别。
>>> df['年级'] = df['年级'].cat.set_categories(['高一', '高三', '高二', '高四'])
>>> df['年级']
0 高二
1 高三
2 高二
3 高三
4 高一
5 高一
6 高二
7 高三
Name: 年级, dtype: category
Categories (4, object): ['高一', '高三', '高二', '高四']
通过groupby()分组类别并统计个数,observed=False表示显示空类别
>>> df.groupby('年级',observed=False).size()
年级
高一 2
高三 3
高二 3
高四 0
dtype: int64
微信公众号:愤怒的it男,超多Python技术干货文章。