• 数据清洗之数据表处理 筛选 增删查改 整理 层次化索引


    数据清洗之数据表处理

     

    1. 数据常用筛选方法

    In [ ]:
    import pandas as pd
    import numpy as np
    
    In [ ]:
    import os
    # 更改文件路劲
    os.chdir('F:CSDN课程内容代码和数据')
    
    In [ ]:
    df = pd.read_csv('baby_trade_history.csv', encoding='utf-8',dtype={'user_id':str})
    
     

    数据筛选

     
    • 查看数据
    In [ ]:
    df.info()
    
    In [ ]:
    df.head(5) #查看前5行
    
    In [ ]:
    df.tail(5) #查看后5行
    
    In [ ]:
    df.columns #查看变量名称(列)
    
     
    • 简单索引
    In [ ]:
    df['user_id']
    
    In [ ]:
    df['user_id'][1:5]# 第二行到第五行
    
    In [ ]:
    # 多个变量选择
    df[['user_id','buy_mount','day']][:5]   
    
     
    • loc和iloc 的使用
    In [ ]:行
    df.loc[3:4]# 选择行索引标签
    
    In [ ]:列
    df.loc[:,['user_id','buy_mount']]#选择某两列
    
    In [ ]:行&列
    df.loc[1:3,['user_id','buy_mount']] #loc在这里选择的是行索引标签
    
    In [ ]:满足一个条件下某些列的值
    df.loc[df.user_id =='786295544',['user_id','buy_mount','day']]
    
    In [ ]:满足多个条件下某些列的值
    df.loc[(df.user_id =='786295544') | (df.user_id =='444069173'),['user_id','buy_mount','day']]# 多个条件选择
    
    In [ ]:
    #注意loc是标签
    #注意iloc是位置
    
    In [ ]:
    df.iloc[:,1:4] #按照位置来选择第二列到第四列
    
    In [ ]:
    df.iloc[:,[0,2]] # 按照位置来选择第1列和第3列
    
    In [ ]:用[1,2]来表示选取单独的某几列
    df.iloc[3,[1,2]] #选择第4行,第2列和第3列数据, 这里的3代表的不是索引标签而是位置
    
    In [ ]:
    df.iloc[2:7,[1,2]] #选择第3行到第7行,第2列和第3列数据
    
     
    • 注意loc和iloc的区别
    In [ ]:行标签2~7的行
    df.loc[2:7]
    
    In [ ]:位置,第2~7行
    df.iloc[2:7]
    
     

    2.数据增加和删除

     
    • 增加一列
    In [ ]:
    #增加一列,购买量,购买量超过3的为高,低于3的为底
    
    In [ ]:
    df['购买量'] = np.where(df['buy_mount'] >3,'高','低')
    
    In [ ]:
    df
    
    In [ ]:
    # 增加行在dataframe中不常用,后面会用其他方法实现
    # 可以使用append方法在 dataframe末尾实现
    
     
    • 可以使用insert方法
    • df.insert(位置,变量名称,值)
    • 将auction_id取出来,放在一列
    In [ ]:
    # 先将这一列取出来,赋值给对象auction_id,然后在数据中删除这一列,再将其添加进去
    
    In [ ]:先找到
    auction_id = df['auction_id']
    
    In [ ]:删除原来的它
    del df['auction_id']
    
    In [ ]:在新的位置(这里是第一列)插入它 
    df.insert(0, 'auction_id', auction_id)
    
    In [ ]:
    df.head(5)
    
     
    • 删除
    In [ ]:
    # 删除这两列,加inplace代表是否在原数据上操作,1代表沿着列的方向
    # 同时删除多个变量,需要以列表的形式
    # 注意inplace =True,代表是否对原数据操作, 否则返回的是视图,并没有对原数据进行操作
    
    In [ ]:
    # labels表示删除的数据, axis表示作用轴,inplace=True表示是否对原数据生效,
    # axis=0按行操作, axis=1按列操作
    
    In [ ]:
    axis = 0 对行
    axis = 1 对列
    df.drop(labels = ['property', '购买量'],axis = 1,inplace=True) #删除这两列,加inplace代表是否在原数据上操作, 1代表沿着列的方向
    
    In [ ]:
    # 按行删除法
    
    In [ ]:
    df.drop(labels = [3,4],inplace = True,axis= 0) # 删除索引标签3和4对应的行
    
    In [ ]:
    df.drop(labels= range(6,11),axis=0,inplace=True)  #删除索引名称1到10,注意range迭代器产生的是1到10
    
    In [ ]:
    # 查看
    df
    
     

    3. 数据修改和查找

    In [ ]:
    df1 = pd.read_csv('sam_tianchi_mum_baby.csv',encoding = 'utf-8',dtype =str)
    
    In [ ]:
    df1.head(5)
    
    In [ ]:
    # 将gender为0的改为女性,1改为男性,2改为未知
    
    In [ ]:
    df1.loc[df['gender'] =='0','gender'] ='女性'
    
    In [ ]:
    df1.loc[df['gender'] =='1','gender'] ='男性'
    
    In [ ]:
    df1.loc[df['gender'] =='2','gender'] ='未知'
    
    In [ ]:
    df1.head(10)
    
     
    • 修改列名称
    • basic.rename(columns={},index={})
    In [ ]:
    # 修改列标签和行索引名称
    df1.rename(columns = {'user_id':'用户ID','birthday':'出生日期','gender':'性别'},inplace = True)
    
    In [ ]:
    df1.rename(index = {1:'one',10:'ten' },inplace = True) #修改行索引名称
    
    In [ ]:
    df1.reset_index(drop=True,inplace=True)# 重置索引,变回0123456……
    
    In [ ]:
    df1.head(10)
    
     
    • 查询
    In [ ]:
    # 条件查询
    df[df.buy_mount > 3] #性别等于未知
    
    In [ ]:
    df[~(df.buy_mount > 3)] # ~代表非,取相反条件的
    
    In [ ]:
    df[ (df.buy_mount > 3) &  (df.day > 20140101)] # 多条件查询
    
    In [ ]:
    #使用between,。      inclusive=True代表包含(闭区间)
    df[ df['buy_mount'].between(4,10,inclusive=True)]
    
    In [ ]:
    # 使用pd.isin()方法
    # 包含后面这几个数的'auction_id'的数据
    df[df['auction_id'].isin([41098319944, 17916191097,21896936223])] 
     

    4 数据整理

     
    • 横向堆叠在数据清洗中不常用,纵向堆叠可以理解为把不同的表,字段名称一样。整合在一起
    In [ ]:
    import xlrd
    workbook = xlrd.open_workbook('meal_order_detail.xlsx')
    sheet_name = workbook.sheet_names() #返回所有sheet的列表
    
    In [ ]:
    sheet_name
    
    In [ ]:
    order1 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail1')
    
    In [ ]:
    order2 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail2')
    
    In [ ]:
    order3 = pd.read_excel('meal_order_detail.xlsx',sheet_name ='meal_order_detail3')
    
    In [ ]:枞向合并
    order = pd.concat([order1,order2,order3],axis=0,ignore_index=False)# 忽略原来的索引,这样就不会覆盖了
    
    In [ ]:
    order1.shape
    
    In [ ]:
    # 通过循环方式进行合并
    
    In [ ]:
    basic = pd.DataFrame()
    for i in sheet_name:
        basic_i = pd.read_excel('meal_order_detail.xlsx', header = 0,sheet_name=i,encoding='utf-8')
        basic = pd.concat([basic,basic_i],axis=0,ignore_index=False) 
    In [ ]:
    basic.shape
    
     
    • 关联
    • 关联字段必须类型一致
    In [ ]:
    df = pd.read_csv('baby_trade_history.csv', encoding='utf-8',dtype={'user_id':str})# 交易数据
    df1 = pd.read_csv('sam_tianchi_mum_baby.csv',encoding = 'utf-8',dtype =str)#婴儿信息
    
    In [ ]:关联
    df2 = pd.merge(left = df, right=df1,  how='inner',  left_on='user_id', right_on = 'user_id')      #how='inner'内连接 
    In [ ]:
    df2.head(10)
    
     

    5 层次化索引

    In [ ]:
    df = pd.read_csv('baby_trade_history.csv', encoding='utf-8',dtype={'user_id':str},index_col=[3,0])

    #i
    ndex_col=[3,0]将数据第4列和第1列当成索引
    #
    dtype={'user_id':str}改变数据类型
    In [ ]:
    df.loc[28] #第一层引用
    
    In [ ]:
    df.loc[28].loc[[82830661,532110457]]#第二层引用
    
     
    • 直接引用两层
    • df3.loc[(a,b),:] #a和b分别代表第一层和第二层的索引
    • 接受tuple
    In [ ]:
    df.loc[(28,[82830661,532110457]),:]# 第二层索引选择,多个选择,多选择的这个必须用另外一个list放进去
    
    In [ ]:
    df.loc[(28,[82830661,532110457]),['auction_id','cat_id']]# 第二层索引选择,选择2个变量(即列标签)
    
    In [ ]:
    df.loc[([28,50014815])] #第一层索引为28和50014815



    所以一定要注意同一层索引的引用要用列表放一起
  • 相关阅读:
    HTML撑起浮动子元素得父元素高度
    H5弃用标签和属性
    HTML常用转义字符
    php微信公众号开发入门
    常见正则表达式总结
    解决上下两个相邻图片之间存在默认间距的问题
    移动端真机调试的两种方法
    H5使用小结
    CF 11D
    Codeforces Round #639 (Div. 2) C Hilbert's Hotel (数学)
  • 原文地址:https://www.cnblogs.com/xingnie/p/12261802.html
Copyright © 2020-2023  润新知