pandas数据集成(concat数据串联& 方式二插入& Join SQL风格合并)&数据清洗(3)


前言

python学习笔记—pandas day8(仅供学习使用)

pandas 提供了多种将 Series、DataFrame 对象组合在一起的功能


一、concat数据串联

若想要插入一行,可执行pandas。append方法

import pandas as pd
import numpy as np
# df1 一班考试成绩
df1 = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试成绩
                  index = list('ABCDEFGHIJ'),# 行标签,用户
                  columns=['Python','Tensorflow','Keras']) # 考试科目

# df2 二班考试科目
df2 = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试成绩
                  index = list('KLMNOPQRST'),# 行标签,用户
                  columns=['Python','Tensorflow','Keras']) # 考试科目

# df3 增加了两个考试科目(一班)
df3 = pd.DataFrame(data = np.random.randint(0,150,size = (10,2)),
                  index = list('ABCDEFGHIJ'),
                  columns=['PyTorch','Paddle'])

display(df1,df2,df3)

run:
在这里插入图片描述
一班二班成绩合并:

# np.concatenate() 
# axis = 0表示 进行行合并
pd.concat([df1,df2],axis = 0)

在这里插入图片描述
一班科目增加,将原来的科目和增加的科目进行合并:

# 合并时,列增加 NaN  == not a number 空数据 404
pd.concat([df1,df3],axis = 1)

run:
在这里插入图片描述

二、 方式二插入

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)),
                  index = list('ABCDEFGHIJ'),
                  columns = ['Python','Keras','Tensorflow'])
df

在这里插入图片描述

df.insert(loc = 2,column = 'Math',value = 150)
df

在这里插入图片描述
在Python后面插入一列,En:

# 获取列索引
# 转换成list列表
# 调用index函数,获取列表中特定字段的位置
# + 1表示在后面
index = list(df.columns).index('Python') + 1

# value指定了随机数字
df.insert(loc = index,column='En',value = np.random.randint(0,151,size = 10 ))
df

在这里插入图片描述
向TensorFlow后面插入一列:

# 获取列索引
# 转换成list列表
# 调用index函数,获取列表中特定字段的位置
# + 1表示在后面
index = list(df.columns).index('Tensorflow') + 1

# value指定了随机数字
df.insert(loc = index,column='中文',value = np.random.randint(0,151,size = 10 ))
df

在这里插入图片描述

三、 Join SQL风格合并

数据创建:

import pandas as pd
import numpy as np
# 表一中记录的是name和体重信息
df1 = pd.DataFrame(data = {'name':['softpo','Daniel','Brandon','Ella'],'weight':[70,55,75,65]})
# 表二中记录的是name和身高信息
df2 = pd.DataFrame(data = {'name':['softpo','Daniel','Brandon','Cindy'],'height':[172,170,170,166]})
df3 = pd.DataFrame(data = {'名字':['softpo','Daniel','Brandon','Cindy'],'height':[172,170,170,166]})

display(df1,df2,df3)

run :
在这里插入图片描述
df1、df2进行合并,df1表示体重、df2表示身高:

pd.merge(df1,df2,) # 根据共同的属性,进行合并
# 共同的属性是name共同拥有的是:sotfpo、Daniel、Barandon

在这里插入图片描述

# 指定了合并时,根据哪一列进行合并,左边根据name右边根据名字,然后进行合并
pd.merge(df1,df3,left_on = 'name',right_on = '名字')

在这里插入图片描述

10名同学,计算每个人平均分,合并:

# 创建10名学生的考试成绩
df4 = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)),
                   index = list('ABCDEFHIJK'),
                   columns=['Python','Keras','Tensorflow'])

df4
# 每个人的各科平均分,Series
s = df4.mean(axis = 1).round(1)

df5 = pd.DataFrame(s,columns=['平均值'])
df5
# 根据某一列,进行合并,df4 和 df5没有共同的一列属性执行,相同
# 共同行索引
# df4 行索引 A ~ K
# df5 行索引 A~ K
pd.merge(df4,df5,left_index = True,right_index=True)
#left_index = True左边根据行索引,right_index=True右边根据行索引

在这里插入图片描述
使用cancat和insert均可以完成上述效果,如下:

pd.concat([df4,df5],axis = 1)

在这里插入图片描述

df4.insert(loc = 3,column='均值',value=df5)
df4

在这里插入图片描述


四、数据清洗

import numpy as np
import pandas as pd
df = pd.DataFrame(data = {'color':['red','blue','red','green','blue',None,'red',np.NaN],
                          'price':[10,20,10,15,20,0,np.NaN,None]}) # 数字,显示时候都是 NaN

df
 # 1、重复数据过滤
df.duplicated() # 判断是否存在重复数据
df.drop_duplicates() # 删除重复数据

# 2、空数据过滤
df.isnull() # 判断是否存在空数据,存在返回True,否则返回False 
df.dropna(how = 'any') # 删除空数据 
# 计算时,None和NaN没有区别
# None Python的数据类型
# NaN是NumPy的数据类型
# 都表示空数据
df.fillna(value=1111) # 填充空数据

# 3、指定行或者列过滤 
del df['color'] # 直接删除某列 
# !!! drop删除,返回值,原来的数据没有修改
# df.drop(labels = ['price'],axis = 1)# 删除指定列
# 没有修改原数据
#df.drop(labels = [0,1,5],axis = 0,inplace = true) # 删除指定行
#左侧出现out时说明原来的数据没有改变,删除price一行后产生了新的对象。
#inplace = true将这个属性添加上后,会将原数据修改。
df.drop(labels = ['price'],axis = 1)# 删除指定列 
df.drop(labels = [0,1,5],axis = 0) # 删除指定行

# 4、函数filter使用 
df = pd.DataFrame(np.array(([3,7,1], [2, 8, 256])), 
				index=['dog', 'cat'], 
				columns=['China', 'America', 'France']) 
df.filter(items=['China', 'France']) 
# 根据正则表达式删选列标签 
df.filter(regex='a$', axis=1) 
# 选择行中包含og 
df.filter(like='og', axis=0)

# 5、异常值过滤 
df2 = pd.DataFrame(data = np.random.randn(10000,3)) # 正态分布数据
# 3σ过滤异常值,σ即是标准差 ,>3σ被认为是标准差
cond = (df2 > 3*df2.std()).any(axis = 1) 
index = df2[cond].index # 不满足条件的行索引 
df2.drop(labels=index,axis = 0) # 根据行索引,进行数据删除

randn创建正太分布,平均值接近零,标准差接近1
在这里插入图片描述
获取每一列的异常值两种方法:

cond = df2.abs() > 3 * df2.std()
cond_0 = cond[0] # 默认[] 只能取列索引
cond_1 = cond[1]
cond_2 = cond[2]

# 逻辑或运算,只要有一个满足,返回True
cond_ = cond_0 | cond_1 | cond_2

df2[cond_]

#方法二:
cond = df2.abs() > 3 * df2.std() # 计算异常值

# axis = 1计算每一行:只要一行中有一个TRUE,返回True
# True,表示异常值
cond_ = cond.any(axis = 1) # 只要有一个为真,返回True

df2[cond_]

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小唁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值