一,pandas应知知识
1.pandas中的常见数据类型
- Series代表单独的一列或者一行
- DataFrame代表整个二维表
二,Series(带标签的-单行/列)
1.Series的两种创建方式
import pandas as pd
#Series创建方式一
a = pd.Series([1,2,3],index = list("abc"))
print(a)
# a 1
# b 2
# c 3
# dtype: int64
#Series创建方式二
temp = {"name":"wangwu","age":30,"tel":"10086"}
b = pd.Series(temp)
print(b)
# name wangwu
# age 30
# tel 10086
# dtype: object
2.Series的切片与索引
2.1切片:data[ start : end : 步长 ]
import pandas as pd
#Series切片
a = pd.Series([1,2,3,4,5,6,7,8,9,10],index = list("abcdefghij"))
# print(a)
qiepian = a[2:8:2]
print(qiepian)
# c 3
# e 5
# g 7
# dtype: int64
2.2索引
import pandas as pd
#Series索引
a = pd.Series([1,2,3,4,5,6,7,8,9,10],index = list("abcdefghij"))
# print(a)
#1.标签名索引
print(a[["b"]]) #获取多个用逗号分割即可,a[["b","c","d"]
# b 2
# dtype: int64
#2.下标索引
print(a[2])
# 3
#3.布尔(条件)索引
print(a[a>4])
# e 5
# f 6
# g 7
# h 8
# i 9
# j 10
2.3获取数据 标签 与 值
import pandas as pd
#Series索引
a = pd.Series([1,2,3,4,5,6,7,8,9,10],index = list("abcdefghij"))
# print(a)
#获取数据标签
print(a.index)
#通过循环来分别获取所有的数据标签
#for i in a.index:
# pirnt(i)
#获取数据值
print(a.values)
# Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], dtype='object')
# [ 1 2 3 4 5 6 7 8 9 10]
3.Series的条件查询
import pandas as pd
#Series查询
a = pd.Series([1,2,3,4,5,6,7,8,9,10],index = list("abcdefghij"))
# print(a)
#获取特定条件的数据,不改变表结构仅将符合条件的数据查询出来
print(a.where(a>5))
# a NaN
# b NaN
# c NaN
# d NaN
# e NaN
# f 6.0
# g 7.0
# h 8.0
# i 9.0
# j 10.0
# dtype: float64
#获取数据并替换
#将值大于3的替换成20,符合条件的不变
print(a.where(a<=3,20))
# a 1
# b 2
# c 3
# d 20
# e 20
# f 20
# g 20
# h 20
# i 20
# j 20
# dtype: int64
4.其他
4.1统计Series数据个数–value_counts()
import pandas as pd
#Series查询
a = pd.Series([1,2,3,4,5,6,7,8,9,10,10],index = list("abcdefghijk"))
# print(a)
temp = pd.Series(a).value_counts()
print(temp)
# 10 2
# 1 1
# 2 1
# 3 1
# 4 1
# 5 1
# 6 1
# 7 1
# 8 1
# 9 1
# dtype: int64
4.2删除固定标签数据–不改变原数据
import pandas as pd
#Series查询
a = pd.Series([1,2,3,4,5,6,7,8,9,10,10],index = list("abcdefghijk"))
# print(a)
print(a.drop(["c","e"]))
# a 1
# b 2
# d 4
# f 6
# g 7
# h 8
# i 9
# j 10
# k 10
# dtype: int64
三,DataFrame(Series容器 行–>axis = 0 ,列–>axis = 1)
1.DataFrame创建的两种方式
import pandas as pd
import numpy as np
#创建方式一
a = pd.DataFrame(np.arange(4).reshape(2,2),index = list("ab"),columns = list("wx"))
print(a)
# w x
# a 0 1
# b 2 3
#创建方式二
temp = {"name":["大","小"],"年龄":[18,21],"tell":["10085","10010"]}
b = pd.DataFrame(temp)
print(b)
# name 年龄 tell
# 0 大 18 10085
# 1 小 21 10010
2.DataFrame查询参数属性
import pandas as pd
import numpy as np
#查询DataFrame属性
temp = {"name":["大","小"],"年龄":[18,21],"tell":["10085","10010"]}
a = pd.DataFrame(temp)
####查询基础属性####
#1.查询行列数
print(a.shape)
# (2, 3)
#2.查询数据类型
print(a.dtypes)
# name object
# 年龄 int64
# tell object
# dtype: object
#3.查询数据维度
print(a.ndim)
# 2
#4.查询行列索引标签
print(a.index)
print(a.columns)
# RangeIndex(start=0, stop=2, step=1)
# Index(['name', '年龄', 'tell'], dtype='object')
#5.查询数据值--返回列表
print(a.values)
# [['大' 18 '10085']
# ['小' 21 '10010']]
####整体概况属性####
#1.查询头几项数据/后几项数据
print(a.head(1))
print(a.tail(1))
# name 年龄 tell
# 0 大 18 10085
# name 年龄 tell
# 1 小 21 10010
#2.查询相关信息
print(a.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 2 entries, 0 to 1
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 name 2 non-null object
# 1 年龄 2 non-null int64
# 2 tell 2 non-null object
# dtypes: int64(1), object(2)
# memory usage: 176.0+ bytes
# None
#3.查询数据统计结果--数值型的(一般也没啥用)
print(a.describe())
# 年龄
# count 2.00000
# mean 19.50000
# std 2.12132
# min 18.00000
# 25% 18.75000
# 50% 19.50000
# 75% 20.25000
# max 21.00000
3.DataFrame按某列排序
数据.sort_values(by = "排序键” ,ascending = False)升序设置为否
- 同样可以按索引进行排序:数据.sort_index(axis=?, ascending = ?)不过用的不多,用的时候再查就行。
import pandas as pd
import numpy as np
#DataFrame数据排序
temp = {"name":["大","小","中"],"年龄":[30,5,17],"tell":["10085","10010","10000"]}
a = pd.DataFrame(temp)
b = a.sort_values(by = "年龄" , ascending = False)
print(b)
# name 年龄 tell
# 0 大 30 10085
# 2 中 17 10000
# 1 小 5 10010
4.DataFrame数据获取与条件获取
4.1取行/列数据
import pandas as pd
import numpy as np
#DataFrame数据取行列数据
temp = {"name":["大","小","中"],"年龄":[30,5,17],"tell":["10085","10010","10000"]}
a = pd.DataFrame(temp)
#取前两行数据--直接用数字默认取行数据
print(a[:2])
#取下标2开始之后的数据
print(a[2:])
# name 年龄 tell
# 0 大 30 10085
# 1 小 5 10010
# name 年龄 tell
# 2 中 17 10000
#按标签取列数据--取单列
print(a["年龄"])
# 0 30
# 1 5
# 2 17
4.2 DataFrame根据 标签 位置 获取
- data.loc 根据标签获取数据
import pandas as pd
import numpy as np
#DataFrame数据获取
temp = {"name":["大","小","中"],"年龄":[30,5,17],"tell":["10085","10010","10000"]}
a = pd.DataFrame(temp)
# name 年龄 tell
# 0 大 30 10085
# 1 小 5 10010
# 2 中 17 10000
#1.获取单个行列标签数据
print(a.loc[0,"年龄"])
# 30
#2.获取多个行标签单个列标签数据
print(a.loc[[0,1],"年龄"])
# 0 30
# 1 5
# Name: 年龄, dtype: int64
#3.获取多个列数据
print(a.loc[1:,["年龄","tell"]])
# 年龄 tell
# 1 5 10010
# 2 17 10000
#4.获取多个行数据(切片)
print(a.loc[0:1,"name"])
# 0 大
# 1 小
- data.iloc 根据位置下标获取数据
import pandas as pd
import numpy as np
#DataFrame数据获取
temp = {"name":["大","小","中"],"年龄":[30,5,17],"tell":["10085","10010","10000"]}
a = pd.DataFrame(temp)
# name 年龄 tell
# 0 大 30 10085
# 1 小 5 10010
# 2 中 17 10000
#1.获取单个行列标签数据
print(a.iloc[0,2])
# 10085
# 2.获取多个行标签单个列标签数据
print(a.iloc[[0,1],1])
# 0 30
# 1 5
# Name: 年龄, dtype: int64
#3.获取多个列数据
print(a.iloc[1:,[1,2]])
# 年龄 tell
# 1 5 10010
# 2 17 10000
#4.获取多个行数据(切片)--与loc不同[0:1]不包含后面下标的数据
print(a.iloc[0:1,0])
# 0 大
4.3 DataFrame数据的布尔索引(多条件-不同条件之间用括号括起来)
- &代表且 | 代表或
import pandas as pd
import numpy as np
#DataFrame数据获取
temp = {"name":["一个","这是三个","这是一个故事"],"年龄":[30,5,17],"num":[5,100,10000]}
a = pd.DataFrame(temp)
# name 年龄 num
# 0 一个 30 5
# 1 这是三个 5 100
# 2 这是一个故事 17 10000
#获取满足 姓名长度大于3 且 num大于500 的数据
res = a[(a["name"].str.len() > 3) & (a["num"] > 500)]
print(res)
# name 年龄 num
# 2 这是一个故事 17 10000
5.DataFrame数据 缺失值 处理
5.1判断数据是否有缺失
import pandas as pd
import numpy as np
#DataFrame数据获取
temp = {"name":["一","二","三"],"年龄":[10,None,17],"num":[5,None,10000]}
a = pd.DataFrame(temp)
# name 年龄 num
# 0 一 10.0 5.0
# 1 二 NaN NaN
# 2 三 17.0 10000.0
#判断是否为缺失值
print(pd.isnull(a))
# name 年龄 num
# 0 False False False
# 1 False True True
# 2 False False False
#判断是否不为缺失值
print(pd.notnull(a))
# name 年龄 num
# 0 True True True
# 1 True False False
# 2 True True True
#判断数据是否包含缺失值--并统计数量(自定义)
print(a.apply(lambda x:np.sum(x.isnull())))
# name 0
# 年龄 1
# num 1
# dtype: int64
5.2缺失数据处理方法
- 一,删除NaN所在行数据
import pandas as pd
import numpy as np
#DataFrame数据获取
temp = {"name":["一","二","三"],"年龄":[10,None,17],"num":[5,None,10000]}
a = pd.DataFrame(temp)
# name 年龄 num
# 0 一 10.0 5.0
# 1 二 NaN NaN
# 2 三 17.0 10000.0
#删除有缺失的数据行
#how 参数 all代表全为NaN才删除,any为存在NaN就删除
#inplace 参数 代表是否对原表进行修改
print(a.dropna(axis = 0,how ="any",inplace = False))
# name 年龄 num
# 0 一 10.0 5.0
# 2 三 17.0 10000.0
- 二,填充缺失数据
import pandas as pd
import numpy as np
#DataFrame数据填充
temp = {"name":["一","二","三"],"年龄":[10,None,17],"num":[5,None,10000]}
a = pd.DataFrame(temp)
# name 年龄 num
# 0 一 10.0 5.0
# 1 二 NaN NaN
# 2 三 17.0 10000.0
##1.统计填充(数值型)
# print(a.fillna(a.mean()))#均值填充
# print(a.fillna(a.median()))#中位数填充
##2.定值填充
print(a.fillna(0))
# name 年龄 num
# 0 一 10.0 5.0
# 1 二 0.0 0.0
# 2 三 17.0 10000.0
##3.前后向填充
print(a.fillna(method = "ffill"))#前项填充
print(a.fillna(method = "bfill"))#后项填充
# name 年龄 num
# 0 一 10.0 5.0
# 1 二 10.0 5.0
# 2 三 17.0 10000.0
# name 年龄 num
# 0 一 10.0 5.0
# 1 二 17.0 10000.0
# 2 三 17.0 10000.0
6.DataFrame数据 重复项 处理(键可设置多个)
- 多个键操作演示:data_match = data_match.drop_duplicates([“entity”, “property”, “value”])
import pandas as pd
import numpy as np
#DataFrame数据重复项处理
temp = {"name":["一","二","三","二","三"],"年龄":[10,5,17,5,17],"num":[5,500,10000,700,8000]}
a = pd.DataFrame(temp)
# name 年龄 num
# 0 一 10 5
# 1 二 5 500
# 2 三 17 10000
# 3 二 5 500
# 4 三 17 10000
##检查是否有重复项
print(any(a.duplicated()))
# True
#去除重复项
#第一个参数代表依据那个标签进行重复项删除
#第二各参数代表保留重复的第一个,还是最后一个,这里是最后一个。默认是第一个
print(a.drop_duplicates("name",keep = "last"))
# name 年龄 num
# 0 一 10 5
# 3 二 5 700
# 4 三 17 8000
7.(应用)将某一索引值列变成列表形式输出
import pandas as pd
import numpy as np
#DataFrame数据取单列
temp = {"name":["一","二","三","二","三"],"年龄":[10,5,17,5,17],"num":[5,500,10000,700,8000]}
a = pd.DataFrame(temp)
# name 年龄 num
# 0 一 10 5
# 1 二 5 500
# 2 三 17 10000
# 3 二 5 700
# 4 三 17 8000
#方法一
res1 = a["name"].tolist()
print(res1)
# ['一', '二', '三', '二', '三']
#方法二:加去重功能
res2 = a["name"].unique()
print(res2)
# ['一' '二' '三']
#方法三:一维变二维,然后展一维
res3 = a["name"].str.split(",").tolist()
print(res3)
# [['一'], ['二'], ['三'], ['二'], ['三']]
res4 = [i for j in res3 for i in j]
print(res4)
# ['一', '二', '三', '二', '三']
#方法四:集合转列表:同样有去重功能
res5 = list(set(a["name"]))
print(res5)
8.数据合并
import pandas as pd
import numpy as np
#DataFrame数据合并
temp1 = {"name":["一","二","三","四","五"],"年龄":[10,5,17,5,17],"num":[5,500,10000,700,8000]}
a = pd.DataFrame(temp1)
temp2 = {"name":["一","二","三","四","五"],"功能":["睡觉","逛街","喝酒","吃饭","打架"],"工资":[100,500,1000,1500,2000]}
b = pd.DataFrame(temp2)
temp3 = {"功能":["睡觉","逛街","喝酒","吃饭","打架"],"工资":[100,500,1000,1500,2000]}
c = pd.DataFrame(temp3)
temp4 = {"name":["一","二","三"],"功能":["睡觉","逛街","喝酒"],"工资":[100,500,1000]}
d = pd.DataFrame(temp4)
# name 年龄 num
# 0 一 10 5
# 1 二 5 500
# 2 三 17 10000
# 3 四 5 700
# 4 五 17 8000
# name 功能 工资
# 0 一 睡觉 100
# 1 二 逛街 500
# 2 三 喝酒 1000
# 3 四 吃饭 1500
# 4 五 打架 2000
# 功能 工资
# 0 睡觉 100
# 1 逛街 500
# 2 喝酒 1000
# 3 吃饭 1500
# 4 打架 2000
# name 功能 工资
# 0 一 睡觉 100
# 1 二 逛街 500
# 2 三 喝酒 1000
###合并方法一:join:将行索引相同的数据合并在一起,列索引不能有相同
# print(a.join(c))#谁在括号里谁的数据就插在后面列
# name 年龄 num 功能 工资
# 0 一 10 5 睡觉 100
# 1 二 5 500 逛街 500
# 2 三 17 10000 喝酒 1000
# 3 四 5 700 吃饭 1500
# 4 五 17 8000 打架 2000
###合并方法二:concat:不需要索引,但需要拼接时对应的行列数量相同,简单的拼接
#axis = 0 是行拼接,即垂直拼接
print(pd.concat([a,c],axis = 0))
# name 年龄 num 功能 工资
# 0 一 10.0 5.0 NaN NaN
# 1 二 5.0 500.0 NaN NaN
# 2 三 17.0 10000.0 NaN NaN
# 3 四 5.0 700.0 NaN NaN
# 4 五 17.0 8000.0 NaN NaN
# 0 NaN NaN NaN 睡觉 100.0
# 1 NaN NaN NaN 逛街 500.0
# 2 NaN NaN NaN 喝酒 1000.0
# 3 NaN NaN NaN 吃饭 1500.0
# 4 NaN NaN NaN 打架 2000.0
#axis = 1 是列拼接,即水平拼接
print(pd.concat([a,c],axis = 1))
# name 年龄 num 功能 工资
# 0 一 10 5 睡觉 100
# 1 二 5 500 逛街 500
# 2 三 17 10000 喝酒 1000
# 3 四 5 700 吃饭 1500
# 4 五 17 8000 打架 2000
###合并方法三:merge:必须有公共的连接键,当存在但是不指定时会自动寻找相同的列后进行合并
#合并方式:
#inner(默认):并集
#outer:交集,NaN补全(即空值用NaN补全)
#left:左连接,NaN补全
#right:右连接,NaN补全
res1 = pd.merge(a,b,on = "name")
print(res1)
# name 年龄 num 功能 工资
# 0 一 10 5 睡觉 100
# 1 二 5 500 逛街 500
# 2 三 17 10000 喝酒 1000
# 3 四 5 700 吃饭 1500
# 4 五 17 8000 打架 2000
#右连接,就变成了以右边数量少的行为对应了
res2 = pd.merge(a,d,on = "name",how = "right")
print(res2)
# name 年龄 num 功能 工资
# 0 一 10 5 睡觉 100
# 1 二 5 500 逛街 500
# 2 三 17 10000 喝酒 1000