1、基础操作
pandas库是基于NumPy库的一个开源Python库,与NumPy库相比,pandas库更擅长处理二维数据 pandas库主要有Series和DataFrame两种数据结构。Series类似于通过NumPy库创建的一维数组,不同的是Series对象不仅包含数值,还包含一组索引,其创建方式如下
import pandas as pd
s1 = pd.Series(["张三","李四","王五"])
s1
0 张三
1 李四
2 王五
dtype: object
DataFrame可以通过列表、字典或二维数组创建,下面分别介绍具体创建方法
a = pd.DataFrame([[1,2],[3,4],[5,6]])
a
| 0 | 1 | |
|---|---|---|
| 0 | 1 | 2 |
| 1 | 3 | 4 |
| 2 | 5 | 6 |
用pandas库的DataFrame()函数创建的DataFrame更像Excel中的二维表格数据,它也有行索引和列索引
创建DataFrame时可以自定义列索引和行索引的名称
b = pd.DataFrame([[1,2],[3,4]],columns=['date','score'],index=['A','B'])
b
| date | score | |
|---|---|---|
| A | 1 | 2 |
| B | 3 | 4 |
通过列表创建DataFrame还可以采用如下方式。
c = pd.DataFrame()
data = [1,3,5]
score = [2,4,6]
c['data'] = data
c['score'] = score
c
| data | score | |
|---|---|---|
| 0 | 1 | 2 |
| 1 | 3 | 4 |
| 2 | 5 | 6 |
注意要保证date列表和score列表的长度一致,否则会报错,a的打印输出结果如下
2、通过字典创建DataFrame
除了通过列表创建DataFrame,还可以通过字典创建DataFrame,并可以自定义列索引,这里默认字典键为列索引
d = pd.DataFrame({"a":[1,3,5],"b":[2,4,6]},index=["x","y","z"])
d
| a | b | |
|---|---|---|
| x | 1 | 2 |
| y | 3 | 4 |
| z | 5 | 6 |
如果想让字典键变成行索引,可以使用from_dict()函数将字典转换成DataFrame,并同时设置orient参数为index
e = pd.DataFrame.from_dict({"a":[1,3,5],"b":[2,4,6]},orient="index")
e
| 0 | 1 | 2 | |
|---|---|---|---|
| a | 1 | 3 | 5 |
| b | 2 | 4 | 6 |
除了使用from_dict()函数的orient参数外,还可以通过DataFrame的T属性对DataFrame进行转置
f = pd.DataFrame({"a":[1,3,5],"b":[2,4,6]})
f.T
| 0 | 1 | 2 | |
|---|---|---|---|
| a | 1 | 3 | 5 |
| b | 2 | 4 | 6 |
f
| a | b | |
|---|---|---|
| 0 | 1 | 2 |
| 1 | 3 | 4 |
| 2 | 5 | 6 |
3、通过二维数组创建DataFrame
import numpy as np
m = pd.DataFrame(np.arange(12).reshape(3,4),index=[1,2,3],columns=["A","B","C","D"])
m
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 0 | 1 | 2 | 3 |
| 2 | 4 | 5 | 6 | 7 |
| 3 | 8 | 9 | 10 | 11 |
若要修改行索引或列索引的名称,可以使用rename()函数。先构造一个DataFrame
n = pd.DataFrame([[1,2],[3,4]],columns=["date","score"],index=["A","B"])
n
| date | score | |
|---|---|---|
| A | 1 | 2 |
| B | 3 | 4 |
t = n.rename(index={"A":"阿里","B":"腾讯"},columns={"date":"日期","score":"分数"})
t
| 日期 | 分数 | |
|---|---|---|
| 阿里 | 1 | 2 |
| 腾讯 | 3 | 4 |
通过values属性可以查看此时的index值
t.index.values
array(['阿里', '腾讯'], dtype=object)
如果想把行索引修改成某列的内容,可以使用set_index()函数
t = t.set_index("日期")
t
| 分数 | |
|---|---|
| 日期 | |
| 1 | 2 |
| 3 | 4 |
如果想把行索引换成数字索引,可以使用reset_index()函数
t.reset_index()
| 日期 | 分数 | |
|---|---|---|
| 0 | 1 | 2 |
| 1 | 3 | 4 |
4、文件的读取
读取csv文件
q = pd.read_csv("D:\\ccc.csv")
q
| 111 | 222 | |
|---|---|---|
| 0 | 22 | 777 |
读取Excel工作簿中的数据
s = pd.read_excel("D:\\test.xls")
使用s.head()函数打印表格的前5行内容
s.head()
5、数据的选取与处理
首先创建一个3行3列的DataFrame用于演示,行索引设定为r1、r2、r3,列索引设定为c1、c2、c3
import pandas as pd
data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index = ["r1","r2","r3"],columns=["c1","c2","c3"])
data
| c1 | c2 | c3 | |
|---|---|---|---|
| r1 | 1 | 2 | 3 |
| r2 | 4 | 5 | 6 |
| r3 | 7 | 8 | 9 |
(1)按列选取数据
a = data["c1"]
a
r1 1
r2 4
r3 7
Name: c1, dtype: int64
可以看到选取的数据不包含列索引信息,这是因为通过data['c1']选取一列时返回的是一个一维的Series类型的数据。通过如下代码可以返回一个二维的表格数据
b = data[["c1"]]
b
| c1 | |
|---|---|
| r1 | 1 |
| r2 | 4 |
| r3 | 7 |
若要选取多列,需要在中括号[]中指定列表。例如,要选取c1和c3列,可以写为
c = data[["c1","c3"]]
c
| c1 | c3 | |
|---|---|---|
| r1 | 1 | 3 |
| r2 | 4 | 6 |
| r3 | 7 | 9 |
(2)按行选取数据
可以根据行序号来选取数据
# 选取,第2-3行数据,注意序号是从0开始,左闭右开
a = data[1:3]
a
| c1 | c2 | c3 | |
|---|---|---|---|
| r2 | 4 | 5 | 6 |
| r3 | 7 | 8 | 9 |
pandas库推荐使用iloc方法来根据行序号选取数据,这样更直观,不会像data[1:3]那样可能会引起混淆
b = data.iloc[1:3]
b
| c1 | c2 | c3 | |
|---|---|---|---|
| r2 | 4 | 5 | 6 |
| r3 | 7 | 8 | 9 |
如果要选取单行,就必须用iloc方法。例如,选取倒数第1行
c = data.iloc[-1]
c
c1 7
c2 8
c3 9
Name: r3, dtype: int64
除了根据行序号选取数据外,还可以通过loc方法根据行的名称来选取数据
d = data.loc[["r1","r3"]]
d
| c1 | c2 | c3 | |
|---|---|---|---|
| r1 | 1 | 2 | 3 |
| r3 | 7 | 8 | 9 |
(3)按区块选取数据
如果想选取某几行的某几列数据,例如,选取c1和c3列的前两行数据
a = data[["c1","c3"]][0:2]
a
| c1 | c3 | |
|---|---|---|
| r1 | 1 | 3 |
| r2 | 4 | 6 |
#也可以写成
a = data[0:2][["c1","c3"]]
a
| c1 | c3 | |
|---|---|---|
| r1 | 1 | 3 |
| r2 | 4 | 6 |
在实战中选取区块数据时,通常先通过iloc选取行,再选取列
b = data.iloc[0:2][["c1","c2"]]
b
| c1 | c2 | |
|---|---|---|
| r1 | 1 | 2 |
| r2 | 4 | 5 |
两种方法的选取效果是一样的,但第二种方法逻辑更清晰,代码不容易混淆,它也是pandas库的官方文档推荐的方法
如果要选取单个值,该方法就更有优势。例如,选取c3列第1行的数据,就不能写成data['c3'][0]或data[0]['c3'],而要先用iloc[0]选取第1行,再选取c3列,代码如下。
c = data.iloc[0]["c3"]
c
3
6、数据筛选
通过在中括号里设定筛选条件可以过滤行。例如,筛选c1列中数字大于1的行,代码如下。
a = data[data["c1"] > 1]
a
| c1 | c2 | c3 | |
|---|---|---|---|
| r2 | 4 | 5 | 6 |
| r3 | 7 | 8 | 9 |
如果有多个筛选条件,可以通过“&”(表示“且”)或“|”(表示“或”)连接。例如,筛选c1列中数字大于1且c2列中数字小于8的行,代码如下。注意在筛选条件两侧要加上小括号。此外,判断两者是否相等是用“==”,而不是“=”(一个等号表示赋值,两个等号表示逻辑判断)
b = data[(data["c1"] > 1 ) & (data["c2"] < 8)]
b
| c1 | c2 | c3 | |
|---|---|---|---|
| r2 | 4 | 5 | 6 |
通过DataFrame的shape属性可以获取表格整体的行数和列数,从而快速了解表格的数据量大小。
data.shape
(3, 3)
通过describe()函数可以快速查看表格每一列的数据个数、平均值、标准差、最小值、25分位数、50分位数、75分位数、最大值等信息,代码如下。
data.describe()
| c1 | c2 | c3 | |
|---|---|---|---|
| count | 3.0 | 3.0 | 3.0 |
| mean | 4.0 | 5.0 | 6.0 |
| std | 3.0 | 3.0 | 3.0 |
| min | 1.0 | 2.0 | 3.0 |
| 25% | 2.5 | 3.5 | 4.5 |
| 50% | 4.0 | 5.0 | 6.0 |
| 75% | 5.5 | 6.5 | 7.5 |
| max | 7.0 | 8.0 | 9.0 |
通过value_counts()函数可以快速查看某一列有几种数据,以及每种数据出现的频次,代码如下。
data["c1"].value_counts()
1 1
4 1
7 1
Name: c1, dtype: int64
7、数据的运算、排序与删除
(1)数据运算
从已有的列中,通过数据运算创建新的一列,代码如下。
data["c4"] = data["c3"] -data["c1"]
data
| c1 | c2 | c3 | c4 | |
|---|---|---|---|---|
| r1 | 1 | 2 | 3 | 2 |
| r2 | 4 | 5 | 6 | 2 |
| r3 | 7 | 8 | 9 | 2 |
(2)数据排序
使用sort_values()函数可以对表格按列排序。例如,按c2列进行降序排序的代码如下。
# by参数用于指定按哪一列来排序;ascending参数默认为True,表示升序排序,
若设置为False则表示降序排序。a的打印输出结果如下。
a = data.sort_values(by="c2",ascending=False)
a
| c1 | c2 | c3 | c4 | |
|---|---|---|---|---|
| r3 | 7 | 8 | 9 | 2 |
| r2 | 4 | 5 | 6 | 2 |
| r1 | 1 | 2 | 3 | 2 |
使用sort_index()函数可以根据行索引进行排序。例如,按行索引进行升序排序的代码如下。
a = a.sort_index()
a
| c1 | c2 | c3 | c4 | |
|---|---|---|---|---|
| r1 | 1 | 2 | 3 | 2 |
| r2 | 4 | 5 | 6 | 2 |
| r3 | 7 | 8 | 9 | 2 |
(3)数据删除
使用drop()函数可以删除表格中的指定数据,具体用法如下。
若要删除单列数据,例如,删除c1列的数据,代码如下。
b =a.drop(columns="c1")
b
| c2 | c3 | c4 | |
|---|---|---|---|
| r1 | 2 | 3 | 2 |
| r2 | 5 | 6 | 2 |
| r3 | 8 | 9 | 2 |
若要删除单列数据,例如,删除c1列的数据,代码如下。
c = a.drop(index=["r1","r2"])
c
| c1 | c2 | c3 | c4 | |
|---|---|---|---|---|
| r3 | 7 | 8 | 9 | 2 |