python学习笔记——数据规整化:清理、转换、合并、重塑

一、合并数据集

代码
merge
  1. 如果没有通过on指定按哪个列进行连接,就默认按照重叠的列名进行连接
  2. 默认是inner,还可以是 left、right、outer,通过how参数赋值指定
  3. 如果根据多个键进行个并,传入这些列构成的列表
  4. suffixes,用于追加到重叠列名的末尾
  5. 索引参于合并,就是left_index、right_index 是否为True)
df1=DataFrame({ 'key' :[ 'b' , 'd' , 'b' , 'g' , 'd' , 'u' , 'a' ], 'data1' :range(7)})
df2=DataFrame({ 'key' :[ 'b' , 'd' , 's' ], 'data2' :range(3)})
df3=pd.merge(df1,df2)
#print(df3)
# 外连接,并集
print(pd.merge(df1,df2,how= 'outer' ))
#左链接
print(pd.merge(df1,df2,how= 'left' ))
#右链接
print(pd.merge(df1,df2,how= 'right' ))
join( 默认是左连接的)
df1=DataFrame({ 'key' :[ 'b' , 'd' , 'b' , 'g' , 'd' , 'u' , 'a' ], 'data1' :range(7)})
df2=DataFrame({ 'key' :[ 'b' , 'd' , 's' ], 'data2' :range(3)})
#print(df1)
#print(df2)
df3=pd.merge(df1,df2)
#print(df3)
print( '******************* 我是分隔符 ************************' )
# 外连接,并集
print(pd.merge(df1,df2,how= 'outer' ))
#左链接
print( '******************* 我是分隔符 ************************' )
print(pd.merge(df1,df2,how= 'left' ))
#右链接
print( '******************* 我是分隔符 ************************' )
print(pd.merge(df1,df2,how= 'right' ))
concat轴向连接() 当没有索引时、concat不管列名, 直接加到一起,可以加到后面、也可以加到右边,axis=0为加到后面,axis=1为加到右边,左边的数据结构没有变,变的是右边数据结构。

 
2.合并重叠数据
combine_first
它实现既不是行之间的连接,也不是列之间的连接,它在为数据“打补丁”:用参数对象中的数据为调用者对象的缺失数据“打补丁”。
三、数据转换
1.移除重复数据
  1. duplicated()返回布尔型序列;
  2. drop_duplicates()返回移除重复行的数据框;
  3. 默认判断全部列,也可以指定要判断的列;
  4. 默认保留第一个出现的值,通过keep=last可以设置保留最后一个/take_last=True

data=DataFrame({ 'k1':[ 'one']* 3+[ 'two']* 4, 'k2':[ 1, 1, 2, 3, 3, 4, 4]})
print(data)
print(data.duplicated())
data[ 'k3']=range( 7)
print(data.drop_duplicates( 'k1'))
print(data.drop_duplicates( 'k1' ,keep= 'last' ))
2. 利用函数或映射进行数据转换
Series的map可以接受一个函数或有映射关系的字典型对象
3. 替换值
    不修改原始数据
s1=Series([1,999,-1000,2,999])
print(s1)
print("*************repalce替换一个值*************")
print(s1.replace(999,np.nan))
print("*************repalce对不同的值进行不同的替换*************")
print(s1.replace([999,-1000],[np.nan,'None']))
print("*************repalce参数形式为字典*************")
print(s1.replace({999:np.nan,-1000:'空值啦'}))
4.重命名轴索引

data=DataFrame(np.arange(12).reshape(3,4),index=['Ohio','Colorado','NewYork'],columns=['one','two','three','four'])
print(data)
print('**************此种方式是就地修改原始数据********************')
data.index=data.index.map(str.upper)#此种方式是就地修改原始数据
print(data)
print('**************这种是通过创建数据的转换版********************')
print (data.rename(index=str.title,columns=str.upper)) # 这种是通过创建数据的转换版,如果希望就地修改,加参数inplace=True
print( '************** 还是那个原始数据 ********************' )
print(data) # 原始数据依旧不变
print('**************结合字典类型对象实现对部分轴标签的更新********************')
print(data.rename(index={'OHIO':'Beijing','COLORADO':'Shanghai'},columns={'one':'first','two':'second'}))
5.离散化和面元划分

# 离散化和面元划分
ages=[ 20, 22, 25, 27, 31, 21, 23, 37, 61, 41, 32]
bin=[ 18, 25, 35, 60, 100]
cats=pd.cut(ages,bin)
print( '**************** 数据划分 ***********************')
print(cats)
print( '**************** 以年龄数据进行分组标号 ******************')
print(cats.codes)
print( '**************** 统计分组组次和频数 ******************')
print(pd.value_counts(cats))
group_names=[ 'Youth', 'YoungAdult', 'MiddleAged', 'Senior']
print( '************** 设置自己的面元(分组)名称 ***************')
print(pd.cut(ages,bin,labels=group_names))
print( '********** 统计设置自己的面元(分组)名称后的组次和频数 ***********')
print(pd.value_counts(pd.cut(ages,bin,labels=group_names)))


print( '**************cut 中传入面元数量而不是面元名称 ************')
data=np.random.rand( 20) # 正态分布
data_cut=pd.cut(data, 4,precision= 5)
print(data_cut)
print( '**************** 统计分组组次和频数 ******************')
print(pd.value_counts(data_cut))data1=np.random.randn( 1000)
data1_cut=pd.qcut(data1, 4)
print( '**************** 按四分位数进行切割 ******************')
print(data1_cut)
print( '**************** 统计分组组次和频数 ******************')
print(pd.value_counts(data1_cut))
print( '**************** 设置自定义分位数 ******************')
data1_cut1=pd.qcut(data1,[ 0, 0.1, 0.5, 0.9, 1])
print(data1_cut1)
print( '**************** 统计分组组次和频数 ******************')
print(pd.value_counts(data1_cut1))
6. 检测和过滤异常值





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值