Python库pandas常用知识学习(不包含时间序列,分组聚合)

一,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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值