文章目录
- 前言
- 一、concat数据串联
- 二、 方式二插入
- 三、 Join SQL风格合并
- 四、数据清洗
- 总结
前言
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_]
总结