一、为什么要学习pandas

二、Pandas读取外部数据

import pandas as pd

# 读取csv文件

df1 = pd.read_csv("./dogNames2.csv",encoding='gbk')

# 读取剪切板

df2 = pd.read_clipboard(sep,kwargs)

# 读取mysql数据库

df3 = pd.read_sql(sql_sentence,connection)

三、Pandas的常用数据类型

Series 一维,带标签数组(也可以叫做带索引的数组)DataFrame 二维,Series 容器(保存多个Series)

四、Series数据类型

1. Series创建、指定索引以及修改dtype类型

import pandas as pd

# 通过列表来创建Series,也可以通过numpy.ndarray创建Series,也可以通过字典创建Series

t1 = pd.Series([3,2,4])

print(t1)

print(type(t1))

# 输出结果:

# 0 3

# 1 2

# 2 4

# dtype: int64

#

t11 = pd.Series(np.arange(3))

print(t11)

# 0 0

# 1 1

# 2 2

***************************************************************************************

# 指定Series的索引

t1 = pd.Series([3,2,4],index=list("abc")) # 其中list()表示将括号里的变成列表的形式

print(t1)

print(type(t1))

# 输出结果:

# a 3

# b 2

# c 4

# dtype: int64

#

print(list("abc"))

# ['a', 'b', 'c']

***************************************************************************************

# 通过字典来创建Series,其中字典的键是Series的索引,字典的值是Series的值

temp_dict = {"name":"xiaoming","age":30,"tel":10086}

t2 = pd.Series(temp_dict)

print(t2)

# 输出结果:

# name xiaoming

# age 30

# tel 10086

# dtype: object

import string

a= {string.ascii_uppercase[i]:i for i in range(10)} # string.ascii_uppercase[i]表示用字符串字母作为索引

t3 = pd.Series(a)

print(t3)

# 输出结果:

# A 0

# B 1

# C 2

# D 3

# E 4

# F 5

# G 6

# H 7

# I 8

# J 9

# dtype: int64

# 重新给其指定其他索引后,如果能够对应上,则取其值,如果不能则为NaN

t3 = pd.Series(a,index=list(string.ascii_uppercase[5:15]))

print(t3)

# 输出结果:

# F 5.0

# G 6.0

# H 7.0

# I 8.0

# J 9.0

# K NaN

# L NaN

# M NaN

# N NaN

# O NaN

# dtype: float64

# 此时存在NaN,则pandas会自动根据数值的数据类型更改Series的dtype类型

****************************************************************************

# 查看Series的dtype类型

t1.dtype

# 修改Series的dtype类型,和numpy的方法一样

t1.astype(float) # 将t1的数值修改为float类型,注意该方法存在返回值,不会修改原始数据的dtype类型

2. Series切片和索引

t2

# name xiaoming

# age 30

# tel 10086

# dtype: object

********************************

# 取单行

# 用字符串索引来取值

t2["age"]

# 30

# 用数字索引来取值

t2[2]

# 10086

*********************************

# 取连续的多行

t2[:2] # 使用该方法无法取到第三行tel

# name xiaoming

# age 30

# dtype: object

t2[:"tel"] # 使用该方法可以取到第三行tel

# name xiaoming

# age 30

# tel 10086

# dtype: object

*********************************

# 取不连续的多行

t2[["age","tel"]]

# age 30

# tel 10086

# dtype: object

t2[[0,2]]

# name xiaoming

# tel 10086

# dtype: object

*********************************

# 布尔索引

t1[t1>10] # 取数值大于10的所有行

3. Series索引和值

t2

# name xiaoming

# age 30

# tel 10086

# dtype: object

******************************************************

# 提取索引

t2.index

# 输出结果:

# Index(['name', 'age', 'tel'], dtype='object')

# t2.index可以进行迭代

for i in t2.index:

print(i)

# 输出结果

# name

# age

# tel

# 查看t2.index类型

type(t2.index)

# 输出结果

#

# 查看t2.index中存在几个数值

len(t2.index)

# 3

# 将t2.index转变为列表

list(t2.index)

# ['name', 'age', 'tel']

list(t2.index)[:2]

# ['name', 'age']

******************************************************

# 提取值

t2.values

# array(['xiaoming' 30 10086],dtype=object)

# t2.values可以进行迭代

for i in t2.values:

print(i)

# 输出结果

# xiaoming

# 30

# 10086

# 查看t2.values类型

type(t2.values)

# 输出结果

#

# 查看t2.values中存在几个数值

len(t2.values)

# 3

# 将t2.values转变为列表

list(t2.values)

# ['xiaoming', 30, 10086]

list(t2.values)[:2]

# ['xiaoming', 30]

4. Series排序方法

五、Dataframe数据类型

1. DataFrame创建和指定索引

import pandas as pd

# 通过numpy.ndarray来创建DataFrame,也可以通过列表创建DataFrame

df1 = pd.DataFrame(np.arange(12).reshape((3,4)))

# 0 1 2 3

# 0 0 1 2 3

# 1 4 5 6 7

# 2 8 9 10 11

df2 = pd.DataFrame([1,2,3,4])

# 0 1

# 1 2

# 2 3

# 3 4

*****************************************************************************************

# 指定索引,index为行索引,columns为列索引

df1 = pd.DataFrame(np.arange(12).reshape((3,4)),index=list("abc"),columns=list("WXYX"))

# W X Y X

# a 0 1 2 3

# b 4 5 6 7

# c 8 9 10 11

*****************************************************************************************

# 通过字典来创建DataFrame

d1 = {"name":["xiaoming","xiaogang"],"age":[20,32],"tel":[10086,10010]}

df2 = pd.DataFrame(d1)

print(df2)

print(type(df2))

# name age tel

# 0 xiaoming 20 10086

# 1 xiaogang 32 10010

#

#

d2 = [{"name":"xiaohong","age":32,"tel":10010},{"name":"xiaoming","tel":10000},{"name":"xiaowang","age":22}]

df3 = pd.DataFrame(d2)

print(df3)

# name age tel

# 0 xiaohong 32.0 10010.0

# 1 xiaoming NaN 10000.0

# 2 xiaowang 22.0 NaN

2. DataFrame常用函数

# DataFrame排序方法

# by参数:根据哪个列/行标签(默认为列)进行排序;

# ascending参数:False表示从大到小进行排序,True表示从小到大进行排序(默认为True);

# axis参数:1表示根据行索引进行排序,0表示根据列索引进行排序(默认为列索引)

df.sort_values(by="",ascending=False)

3. DataFrame切片和索引

df1 = pd.DataFrame(np.arange(12).reshape((3,4)),index=list("abc"),columns=list("WXYZ"))

# W X Y Z

# a 0 1 2 3

# b 4 5 6 7

# c 8 9 10 11

****************************************************************************************

# 方括号写数组,表示取行,对行进行操作

df1[:2] # 注意里面必须是这种形式[a:b:c]

type(df1[:2])

# W X Y X

# a 0 1 2 3

# b 4 5 6 7

#

****************************************************************************************

# 方括号写字符串,表示取列,对列进行操作

df1["W"]

type(df1["W"])

# a 0

# b 4

# c 8

# Name: W, dtype: int32

#

****************************************************************************************

# 还有更多的经过pandas优化过的选择方法:

# .loc通过标签索引获取数据

## 取单行

df1.loc["a"] # df1.loc["a",:]

# W 0

# X 1

# Y 2

# Z 3

# Name: a, dtype: int32

## 取单列

df1.loc[:,"X"]

# a 1

# b 5

# c 9

# Name: X, dtype: int32

## 取多行

df1.loc[["a","c"]] # df1.loc[["a","c"],:]

# W X Y Z

# a 0 1 2 3

# c 8 9 10 11

df1.loc["a":"c",:] # 注意此时会取到"c"行,且冒号在loc里面是闭合的,无需使用[]

# W X Y Z

# a 0 1 2 3

# b 4 5 6 7

# c 8 9 10 11

## 取多列

df1.loc[:,["W","Y"]]

# W Y

# a 0 2

# b 4 6

# c 8 10

## 取某个数值

df1.loc["a","X"]

# 1

## 取多行多列,注意此时不是取点

df1.loc[["a","b"],["W","X"]]

# W X

# a 0 1

# b 4 5

*****************************************************************************

# .iloc通过位置获取数据

## 取单行

df1.iloc[1]

# W 4

# X 5

# Y 6

# Z 7

# Name: b, dtype: int32

## 取单列

df1.iloc[:,2]

# a 2

# b 6

# c 10

# Name: Y, dtype: int32

## 取多行

df1.iloc[:2]

# W X Y Z

# a 0 1 2 3

# b 4 5 6 7

## 取多列

df1.iloc[:,:2]

# W X

# a 0 1

# b 4 5

# c 8 9

## 取某个数值

df1.iloc[0,2]

# 2

## 取多行多列

df1.iloc[[0,1],[1,2]]

# X Y

# a 1 2

# b 5 6

****************************************************************************

# 还可以对选出来的数据进行赋值更改数据

df1.loc["a","X"] = 0

print(df1)

# W X Y Z

# a 0 0 2 3

# b 4 5 6 7

# c 8 9 10 11

df1.iloc[0,2] = 0

print(df1)

# W X Y Z

# a 0 1 0 3

# b 4 5 6 7

# c 8 9 10 11

4. Dataframe新添一列

df1["cat"]= 直接新建一列

5. DataFrame一列分多列,多个分隔符分割字符串等等,还有交换列顺序

6. DataFrame中的排序.sort_index/.sort_values与汇总方法

pandas | DataFrame中的排序与汇总方法 - 知乎

7. DataFrame去除重复项-df.drop_duplicates()

8. Dataframe删除一行并重建索引

import pandas as pd

df = pd.Dataframe(np.arange(5).reshape(5,1))

df

out:

0

0 0

1 1

2 2

3 3

4 4

# 删除第3行

df.drop([2], inplace=True) #.drop默认不进行重建索引

df = df.reset_index(drop=True)

df

0

0 0

1 1

2 3

3 4

✅六、布尔索引-通过将数组中True的位置进行提取

# 并

df1[(3

# W X Y Z

# b 4 5 6 7

# 或

df1[(df1["Z"]<4)|(df1["Z"]>10)]

# W X Y Z

# a 0 0 0 3

# c 8 9 10 11

✅✅七、字符串的内置函数-str

.str.split("")-用于根据某个字符进行分割

# .tolist() --> 将Series转换为列表

.str.replace()-用于去除字符串中空格,相当于excel中的查找替换

✅八、缺失数据的处理

.isnull()、.notnull()

.dropna()

.fillna()

九、数据合并

1. Join 按照行索引进行合并

只有存在行索引相同才能进行合并

2. Merge按照列索引进行合并

df1 = pd.DataFrame(np.ones((2,4)),index=list("AB"),columns=list("abcd"))

df1.loc["A","a"] = 100

print(df1)

df2 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list("fax"))

print(df2)

十、分组与聚合- .groupby()

分组

按照一个条件进行分组

按照多个条件进行分组

聚合

十一、索引和复合索引

1. 索引

案例:

2. 复合索引

a = pd.DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':list("hjklmno")})

a

# a b c d

# 0 0 7 one h

# 1 1 6 one j

# 2 2 5 one k

# 3 3 4 two l

# 4 4 3 two m

# 5 5 2 two n

# 6 6 1 two o

# Series

b = a.set_index(['c','d'])['a']

b

# c d

# one h 0

# j 1

# k 2

# two l 3

# m 4

# n 5

# o 6

# Name: a, dtype: int64

type(b)

#

b['one']['j']

# 1

b['one']

# d

# h 0

# j 1

# k 2

# Name: a, dtype: int64

c = a.set_index(['d','c'])['a']

c

# d c

# h one 0

# j one 1

# k one 2

# l two 3

# m two 4

# n two 5

# o two 6

# Name: a, dtype: int64

c.swaplevel()

# c d

# one h 0

# j 1

# k 2

# two l 3

# m 4

# n 5

# o 6

# Name: a, dtype: int64

c.swaplevel()["one"] # 默认从外层开始取,.swaplevel可以修改为从内层开始取

# d

# h 0

# j 1

# k 2

# Name: a, dtype: int64

# Dataframe

d = a.set_index(['c','d']) # 将c和d列变成行索引

d

# a b

# c d

# one h 0 7

# j 1 6

# k 2 5

# two l 3 4

# m 4 3

# n 5 2

# o 6 1

d.loc["one"].loc["h"]

# a 0

# b 7

# Name: h, dtype: int64

d.swaplevel().loc["h"]

# a b

# c

# one 0 7

十二、Pandas时间序列

1. DatetimeIndex时间戳

①. 生成一段时间范围(生成时间序列)

freq参数

以下几类start可以直接生成为时间序列

②. 将时间字符串转化为时间序列

其中以下几种时间字符串可以直接转换为时间序列

将无法直接转换为时间序列的时间字符串进行format格式化

format参数使用:Pandas日期时间格式化

③. 时间序列的重采样-pandas提供一个resample的方法来实现利用时间序列的年、月、日等进行频率计算

2. 时间段-PeriodIndex

①. 作用:将特殊的时间数据转化为时间序列

②. 时间序列的重采样-pandas提供一个resample的方法来实现利用时间序列的年、月、日等进行频率计算

使用方法和时间戳重采样一致

十三、学习资料

Pandas官方文档:pandas.Series.where — pandas 1.5.3 documentation

当不知道pandas中函数的使用方法时,可以通过以下方式查找使用方法

eg:在网页中搜索Pandas的where函数的使用方法:

Pandas官方文档:pandas.Series.where — pandas 1.5.3 documentation

扩展内容:

1. 通过源码来安装模块

百度搜索pandas pypi

选择合适的版本下载安装包 pandas · PyPI

开始安装模块

如果下载的是.tar.gz压缩文件,则需要将文件进行解压缩,解压缩后会出现 setup.py 文件,进入setup.py文件的路径执行 python setup.py install

如果下载的是.whl 文件,则步骤如下:

① 用管理员方式打开 cmd

② 通过 pip 命令安装 wheel

在 cmd 下进入到 D:\Python27\Scripts 目录下执行该命令 pip install wheel

如果提示’pip’不是内部或外部命令,也不是可运行的程序或批处理文件,将python安装目录下的 scripts 目录(例如D:\Python27\Scripts)添加到系统环境变量 path 里,注意前加分号。再执行该命令。

③ 安装 .whl 文件

如果将 D:\Python27\Scripts 目录添加到 path 中,可以直接在 .whl 文件所在目录用管理员打开一个cmd窗口,直接执行下面的语句。

pip install xxxx.whl

否则的话,需要在 D:\Python27\Scripts 目录下用管理员打开 cmd ,执行下面语句 (文件名应该写全路径)

pip install .whl文件的全路径

eg:pip install C:\Users\xxx\Downloads\python_dateutil-2.5.3-py2.py3-none-any.whl

注:.whl 格式本质上是一个压缩包,里面包含了 py 文件,以及经过编译的 pyd 文件。使得可以在不具备编译 环境的情况下,选择合适自己的 python 环境进行安装。

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: