看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本节,将介绍 Pandas 最常用的一些功能,今后几乎在所有的数据处理和分析过程中,都会用到,也是最简单的方法。现在,让我们马上来使用 pandas。
首先,需要进行安装 pandas 库才可使用它强大的功能。打开「终端」执行以下命令:
pip install pandas matplotlib
# 国外网络慢,可指定国内源快速下载安装
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
相关的依赖包也会被安装,为了方便起见后期也会用到的其他安装包也可一次性安装好:
# 将上边代码中的 pandas 替换成以下包名
# excel 处理相关包 xlrd openpyxl xlsxwriter
# 解析网页包 requests lxml html5lib BeautifulSoup4
# 可视化包 matplotlib seaborn plotly bokeh
# 计算包:scipy statsmodels
在分析处理数据时,我们要先了解数据集。对所持有数据各字段业务意义的理解是我们分析数据的前提。
接下来,我们看看这个数据(可下载下来查看文件内容):
https://gairuo.com/file/data/team.xlsx
name | team | Q1 | Q2 | Q3 | Q4 |
---|---|---|---|---|---|
Liver | E | 89 | 21 | 24 | 64 |
Arry | C | 36 | 37 | 37 | 57 |
Ack | A | 57 | 60 | 18 | 84 |
Eorge | C | 93 | 96 | 71 | 78 |
Oah | D | 65 | 49 | 61 | 86 |
... | ... | ... | ... | ... | ... |
这是一个学生各季度成绩总表(节选),各列说明:
我们将数据读取到 pandas 里,变量名用 df
DataFrame 的意思,它是 Pandas 二维数据的基础结构。接下来,启动 notebook 开始写代码吧!
import pandas as pd # 引入 pandas 库,按惯例起别名 pd
# 以下两种效果一样,如果是网址它会自动下载数据到内存
df = pd.read_excel('https://www.gairuo.com/file/data/team.xlsx')
df = pd.read_excel('team.xlsx') # 文件在 notebook 文件同一目录下
# 如果是 csv 的话使用 pd.read_csv() ,还支持很多类型的数据读取
然后我们输出 df
看一下内容:
在 Jupyter Notebook 上效果是这样的:
其中:
拿到数据,我们需要验证一下,数据是否加载正确,数据大小是否正常。
df.shape # (100, 6) 查看行数和列数
df.info() # 查看索引、数据类型和内存信息
df.describe() # 查看数值型列的汇总统计
df.dtypes # 查看各字段类型
df.axes # 显示数据行和列名
df.index # 查看索引
df.columns # 列名
df.info()
显示有数据类型、索引情况、行列数、各字段数据类型、内存占用等:
df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 100 non-null object
1 team 100 non-null object
2 Q1 100 non-null int64
3 Q2 100 non-null int64
4 Q3 100 non-null int64
5 Q4 100 non-null int64
dtypes: int64(4), object(2)
memory usage: 4.8+ KB
'''
df.describe()
会计算出各数字字段的总数、平均数、标准差、最大最小值和四分位数:
df.describe()
'''
Q1 Q2 Q3 Q4
count 100.000000 100.000000 100.000000 100.000000
mean 49.200000 52.550000 52.670000 52.780000
std 29.962603 29.845181 26.543677 27.818524
min 1.000000 1.000000 1.000000 2.000000
25% 19.500000 26.750000 29.500000 29.500000
50% 51.500000 49.500000 55.000000 53.000000
75% 74.250000 77.750000 76.250000 75.250000
max 98.000000 99.000000 99.000000 99.000000
'''
以上数据真正业务意义上的索引是 name
列,所以我们需要使它成功索引:
df.set_index('name', inplace=True) # 建立索引并生效
其中可选参数 inplace=True
会将指定好索引的数据再赋值给 df
使索引生效,否则不会生效。注意,我们这儿并没有对原 excel 做修改,从我们读取数据后就已经和它没有关系了,我们处理的是内存中 df
变量。
df.head() # 查看前 5 条,括号里可以传你想看的条数
接下来,我们像 Excel 那样,对数据做一些筛选工作。
df.head(n) # 查看 DataFrame 对象的前n行
df.tail(n) # 查看 DataFrame 对象的最后n行
df.sample(n) # 查看 n 个样本,随机
# 查看指定列
df['Q1']
df.Q1 # 同上,如果列名符合 python 变量名要求,可使用
输出:
df.Q1
'''
name
Liver 89
Arry 36
Ack 57
Eorge 93
Oah 65
..
Gabriel 48
Austin7 21
Lincoln4 98
Eli 11
Ben 21
Name: Q1, Length: 100, dtype: int64
'''
这里返回的是一个 Series
类型数据, 可以理解为数列,它也是带索引的,我们在之前建立了索引,在这儿发挥出了作用,不然我们索引是一个数字,我们无法知道是谁的数据。
# 选择多列
df[['team', 'Q1']] # 只看这两列,注意括号
df.loc[:, ['team', 'Q1']] # 和上边效果一样
df.loc[x, y]
是一个非常强大的数据选择函数,其中 x
代表行,y
代表列,行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引需要用 df.iloc[]
)。下边的例子中会进行演示。
# 用人工索引选取
df[df.index == 'Liver'] # 指定索引
# 用自然索引选择,类似列表的切片
df[0:3] # 取前三行,
df[0:10:2] # 前10个,每两个取一个
df.iloc[:10,:] # 前10个
df.loc['Ben', 'Q1':'Q4'] # 只看 Ben 的四个季度成绩
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间
# 单一条件
df[df.Q1 > 90] # Q1 列大于90的
df[df.team == 'C'] # team 列为 'C' 的
df[df.index == 'Oscar'] # 指定索引即原数据中的 name
# 组合条件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and 关系
df[df['team'] == 'C'].loc[df.Q1>90] # 多重筛选
df.sort_values(by='Q1') # 按 Q1 列数据升序排列
df.sort_values(by='Q1', ascending=False) # 降序
df.sort_values(['team', 'Q1'], ascending=[True, False]) # team 升,Q1 降序
我们可以实现类似 SQL groupby 那样的数据透视功能:
df.groupby('team').sum() # 按团队分组对应列相加
df.groupby('team').mean() # 按团队分组对应列求平均
# 不同列不同的计算方法
df.groupby('team').agg({'Q1': sum, # 总和
'Q2': 'count', # 总数
'Q3':'mean', # 平均
'Q4': max}) # 最大值
可以对数据表进行转置,以 A-Q1 和 E-Q4 为两点组成的折线为轴对数据进行旋转:
df.groupby('team').sum().T
也可以试试以下功能,看有什么效果:
df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()
Pandas 增加一列非常方便,就是新定义一个字典的键值一样。
df['one'] = 1 # 增加一个固定值的列
df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加总成绩列
# 指定一些列相加增加一个新列
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1)
df['total'] = df.sum(axis=1) # 可以把所有为数字的列相加
df['avg'] = df.total/4 # 增加平均成绩列
根据你的数据分析目标,试着使用以下函数,然后看看能得到什么结论吧。
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 方差
s.mode() # 众数
Pandas 利用plot()
调用 matplotlib
快速绘制出数据可视化图形。注意,第一次使用 plot()
时可能需要执行两下才能显示图形。
df['Q1'].plot() # Q1 成绩的折线分布
df.loc['Ben','Q1':'Q4'].plot() # ben 四个季度的成绩变化
df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 横向柱状图
df.groupby('team').sum().T.plot() # 各 Team 四个季度总成绩趋势
df.groupby('team').count().Q1.plot.pie() # 各组人数对比
可以非常轻松地导出 Excel 和 CSV 文件。
df.to_excel('team-done.xlsx') # 导出 excel
df.to_csv('team-done.csv') # 导出 csv
快去 notebook 文件同一目录下去找找它吧,打开看看。
更新时间:2024-05-05 07:55:22 标签:pandas 入门