文章目录

  • 前言
  • 一、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:

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_Python


一班二班成绩合并:

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_python_02


一班科目增加,将原来的科目和增加的科目进行合并:

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

run:

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_python_03

二、 方式二插入

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_数据_04

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_python_05


在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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_数据_06


向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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_数据_07

三、 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 :

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_Python_08


df1、df2进行合并,df1表示体重、df2表示身高:

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_f5_09

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_Python_10

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右边根据行索引

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_数据_11


使用cancat和insert均可以完成上述效果,如下:

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_数据_12

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_f5_13


四、数据清洗

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

如何将Series数据以行的形式合并到DataFrame dataframe多行合并成一行_f5_14


获取每一列的异常值两种方法:

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_]

总结