pandas 基础使用

238 阅读7分钟

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