一、为什么要学习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 环境进行安装。 文章来源
发表评论