• third
    2019-02-05
    自己不知道有没有什么好的工具,所以就把图片上一个一个敲进去了。
    数据.csv格式
    链接:https://pan.baidu.com/s/1jNnUpntrlxFSubmna3HtXw
    提取码:e9hc

    作者回复: 感谢分享

     1
     33
  • Hot Heat
    2019-01-07
    可以给个样例数据的链接吗?自己动手操作一下
    
     20
  • wonderland
    2019-01-10
    一、首先按照所讲的数据质量准则,数据存在的问题有:
    1."完整性"问题:数据有缺失,在ounces列的第三行存在缺失值
    处理办法:可以用该列的平均值来填充此缺失值
    2.“全面性”问题:food列的值大小写不统一
    处理办法:统一改为小写
    3.“合理性”问题:某一行的ounces值出现负值
    处理办法:将该条数据记录删除
    4.“唯一性”问题:food列大小写统一后会出现同名现象,
    处理办法:需要将food列和animal列值均相同的数据记录进行合并到同一天记录中国
    展开

    作者回复: Good Job

    
     19
  • 滢
    2019-04-11
    原始数据链接:https://github.com/onlyAngelia/Read-Mark/blob/master/数据分析/geekTime/data/accountMessage.xlsx (课程中讲解原始数据-点击view Raw即可下载)
    课后练习原始数据: https://github.com/onlyAngelia/Read-Mark/blob/master/数据分析/geekTime/data/foodInformation.xlsx (点击View Raw下载)

    作者回复: 滢同学很好的分享!

     2
     17
  • aof
    2019-01-07
    这些东西,大家都一定要上手去实现一遍。最简单的就是,搞一个文本,把这些数据放进去,用Python读这个文本,转成dataframe,把老师讲的那些清洗相关的API都一个一个试一下,才会有体会,光看一遍真的没啥用的!
    现在只是很少的几十条数据,等你真正去搞那些上亿的数据的时候,就知道核对数据是个多么复杂的事情了……

    作者回复: 对的 一定要自己模拟操作下

    
     10
  • 晨星
    2019-02-19
    import pandas as pd
    """利用Pandas清洗美食数据"""

    # 读取csv文件
    df = pd.read_csv("c.csv")

    df['food'] = df['food'].str.lower() # 统一为小写字母
    df.dropna(inplace=True) # 删除数据缺失的记录
    df['ounces'] = df['ounces'].apply(lambda a: abs(a)) # 负值不合法,取绝对值

    # 查找food重复的记录,分组求其平均值
    d_rows = df[df['food'].duplicated(keep=False)]
    g_items = d_rows.groupby('food').mean()
    g_items['food'] = g_items.index
    print(g_items)

    # 遍历将重复food的平均值赋值给df
    for i, row in g_items.iterrows():
        df.loc[df.food == row.food, 'ounces'] = row.ounces
    df.drop_duplicates(inplace=True) # 删除重复记录

    df.index = range(len(df)) # 重设索引值
    print(df)
    展开

    作者回复: Good Job

     1
     8
  • nrvna
    2019-01-09
    jupyter notebook,python3

    import pandas as pd
    df = pd.read_csv("D://Data_for_sci/food.csv")
    df.index

    df

    # Data cleaning for lowercase
    df['food'] = df['food'].str.lower()
    df

    # Delet NaN
    df = df.dropna()
    df.index = range(len(df)) # reset index
    df

    # Get bacon's mean value and delet second one
    df.loc[0,'ounces'] = df[df['food'].isin(['bacon'])].mean()['ounces']
    df.drop(df.index[4],inplace=True)
    df.index = range(len(df)) # reset index
    df

    #Get pastrami's mean value and delet second one
    df.loc[2,'ounces'] = df[df['food'].isin(['pastrami'])].mean()['ounces']
    df.drop(df.index[4],inplace=True)
    df.index = range(len(df)) # reset index
    df




    展开
    
     8
  • Jbin
    2019-01-07
    练习题中:
    1、food列中出现大小写不同的情况。根据实际,如果大小写不同的两个数据代表的产品不同,则不改变,否则统一改为小写
    2、food列bacon出现了三次,但是有两次是有正确数据,不能通过food去重。
    3、ounces列,去除空值行。根据实际数据来源以及分析目的,是否可能有负的情况,判断是否去除-3行

    以上为个人的一些想法,有考虑不周的地方希望老师可以指导。
    展开
    
     7
  • 上官
    2019-01-08
    weight = int(float((lbs_row['weight'][:-3])/2.2)
    老师好,这行代码中[:-3]的作用是什么啊?


    作者回复: 截取从头开始到倒数第三个字符之前,即去掉lbs。

    
     5
  • auroroa
    2019-01-07
    最大的问题是不是没把数据的来源和目的描述清楚?😄
    
     5
  • 桃园悠然在
    2019-01-07
    我的理解,不能对food列简单去重吧,而是规范ounces列数据后汇总或者保持原样,这可能使厨房食材消耗记录。数据清洗还是要结合完全合一+业务含义。
    
     5
  • 滢
    2019-04-11
    觉得完全合一原则挺好,不过有些操作顺序是不是得更改一下,比如数值补全要在删除全空行之后,否则在补全的时候全空行也会补全。接下来总结在清洗过程中的问题:(1) 不知道Python2 执行情况如何,在用Python3进行数据清理的时候,对于女性三围数据补全的时候因为列中有空字符的存在,会提示‘must str not int’,需要自己过滤含有数值的有效数据进行mean()计算。 (2)生成的新列一般会自动补到后面,但first_name,last_name需要在第一列和第二列,所以要进行列移动或列交换。(3)在删除数据之后默认加载的索引会出现问题,需要自己更新索引

    作者回复: 不错的分享

    
     4
  • 爱做梦的咸鱼
    2019-01-29
    建议老师涉及到数据集练习的可以把数据放在github上,方便我们做同步练习。
    
     4
  • 程序员小熊猫
    2019-01-19
    将磅(lbs)转化为千克(kgs):
    感觉这个地方写复杂了,直接用正则表达式替换就行了
    df['Weight'].replace('lbs$', 'kgs', regex=True, inplace=True)
    
     3
  • 周飞
    2019-01-12
    完整性:ounces 列数据中存在NAN
    全面性:food列数据中存在大小写不一致问题
    合法性:ounces列数据存在负值
    唯一性:food列数据存在重复
    # -*- coding: utf-8 -*
    import pandas as pd
    import numpy as np
    from pandas import Series, DataFrame
    df = pd.read_csv('./fooddata.csv')
    # 把ounces 列中的NaN替换为平均值
    df['ounces'].fillna(df['ounces'].mean(), inplace=True)
    # 把food列中的大写字母全部转换为小写
    df['food'] = df['food'].str.lower()
    # 把ounces 列中的负数转化为正数
    df['ounces']= df['ounces'].apply(lambda x: abs(x))
    #删除food列中的重复值
    df.drop_duplicates('food',inplace=True)
    print (df)
    展开

    作者回复: Good Job

    
     3
  • 王彬成
    2019-02-12
    以下为对文中的案例进行编码操作,有三个问题请教
    1、重量【‘weight’】一列的数据,如何利用平均值进行填充,因为该列是字符类型,无法求平均。目前采用高频数据填充
    2、Pink Panther用户的三围数据如何填充?,我想利用对应性别的平均值填充
    3、案例中,后6列不显示‘NaN’,是因为填充列‘空格’吗?
    _____________________
    import pandas as pd
    ## 导入数据
    df=pd.read_csv('第11节数据.csv')
    ## 重命名列名columns
    df.rename(columns={'0':'Number','1':'Name','2':'Age','3':'Weight','4':'m0006','5':'m0612','6':'m1218'
                      ,'7':'f0006','8':'f0612','9':'f1218'},inplace=True)

    #2.全面性
    #列数据统一单位
    # 获取weight 数据列中单位为lbs的数据
    rows_with_lbs=df['Weight'].str.contains('lbs').fillna(False)
    print(df[rows_with_lbs])
    # 将lbs转换为kgs,2.2lbs=1kgs
    for i,lbs_row in df[rows_with_lbs].iterrows():
        # 截取从头开始到倒数第三个字符之前,即去掉lbs
        weight=int(float(lbs_row['Weight'][:-3])/2.2)
        df.at[i,'Weight']='{}kgs'.format(weight)

    #1.完整性
    # 删除全空的行
    df.dropna(how='all',inplace=True)

    ##缺失值补充方式一
    ## df[‘Age’] 中缺失的数值用平均年龄进行填充
    #df['Age'].fillna(df['Age'].mean(),inplace=True)

    ## 缺失值补充方式二
    ## 使用Age一列高频数据进行填充
    age_maxf=df['Age'].value_counts().index[0]
    df['Age'].fillna(age_maxf,inplace=True)

    ## 使用Weight一列高频数据进行填充
    weight_maxf=df['Weight'].value_counts().index[0]
    df['Weight'].fillna(weight_maxf,inplace=True)

    #4.唯一性
    #Name拆分为firstname和lastname
    #切分名字,删除源数据列
    df[['first_name','last_name']]=df['Name'].str.split(expand=True)
    df.drop('Name',axis=1,inplace=True)

    # 移动first_name和last_name这俩列
    first_name=df.pop('first_name')
    df.insert(1,'first_name',first_name)
    last_name=df.pop('last_name')
    df.insert(2,'last_name',last_name)

    #删除重复数据行
    df.drop_duplicates(['first_name','last_name'],inplace=True)

    #3.合理性
    # 删除非ASCII字符
    df['first_name'].replace({r'[^\x00-\x7F]+':''},regex=True,inplace=True)
    df['last_name'].replace({r'[^\x00-\x7F]+':''},regex=True,inplace=True)

    df
    展开
    
     2
  • lingmacker
    2019-01-17
    import pandas as pd


    def wash_data():
        data = pd.read_excel("./data/data.xlsx")
        data["food"] = data["food"].str.capitalize() # 首字母大写
        data.fillna(0, inplace=True)
        data.drop_duplicates("food", inplace=True) # 删除重复行
        
        data.to_excel("./data/re_data.xlsx")


    if __name__ == '__main__':
        wash_data()


    是不是清洗得太简单了。。。
    展开
     1
     2
  • Chino
    2019-01-17
    有一个问题 就是代码最后那里to_excel 如果参数的路径是指定的那种 就会报错显示filenotfound 搜了很久都没找到是什么原因 求解
    另外感觉这一讲有好多点都没讲深入呀 下面代码是对课程中的样例进行清洗 感觉只能做到几小点了. 特别是在填充nan值的时候 一开始想着遍历每一个nan值 然后再特判列的类型进行填充的. 但是发现三围那里有个大问题 按理说三围应该是int类型 但是因为有- 这个东西的存在 搞的三围是object类型 一开始赋值的时候报错提示需要str 后来想把列的类型转换成int也失败了 还有好多地方都卡着了...
    import pandas as pd
    import numpy as np
    from pandas import Series, DataFrame

    data = DataFrame(pd.read_excel('~/Desktop/data.xlsx'))

    print(data)

    # 更改列名
    data.rename(columns={0:'序号',1:'姓名',2:'年龄',3:'体重',4:'男三围1',5:'男三围2',6:'男三围3',7:'女三围1',8:'女三围2',9:'女三围3'},inplace = True)

    # 去掉重复行
    data = data.drop_duplicates()

    # 1.完整性
    # 填充缺失值
    col = data.columns.values.tolist()
    row = data._stat_axis.values.tolist()

    # 先把姓名的数据类型改成字符串
    data['姓名'] = data['姓名'].astype('str')

    # 1.1 先清除空行
    data.dropna(how = 'all', inplace = True)

    # 1.2 填充缺失值
    age_maxf = data['年龄'].value_counts().index[0]

    # 以年龄频率最大值来填充
    data['年龄'].fillna(age_maxf, inplace=True)

    # 2.全面性
    # 把体重单位为lbs的转化为kgs 2.2lbs = 1kgs
    # 把所有体重单位为lbs的记录存放在一起 (如果体重是nan则不要)
    rows_with_lbs = data['体重'].str.contains('lbs').fillna(False)

    for i,lbs_row in data[rows_with_lbs].iterrows():
        weight = int(float(lbs_row['体重'][:-3]) / 2.2)
        # 第一个参数是y坐标(竖) 第二个参数是x坐标(横)
        data.at[i,'体重'] = '{}kgs'.format(weight)

    print(data)

    # 把清洗后的数据输出
    data.to_excel('CleanData.xlsx')
    # 会报错
    # data.to_excel('~/Desktop/CleanData.xlsx')
    展开

    作者回复: Good Job!

    
     2
  • 北方
    2019-01-11
    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    # __author__ = '北方姆Q'
    # __datetime__ = 2019/1/11 15:53


    import pandas as pd

    # 导入
    df = pd.read_csv("./s11.csv")
    # 去除完全的空行
    df.dropna(how='all', inplace=True)
    # 食物名切分并去掉原本列
    df[["first_name", "last_name"]] = df["food"].str.split(expand=True)
    df.drop("food", axis=1, inplace=True)
    # 名称首字母大写
    df["first_name"] = df["first_name"].str.capitalize()
    df["last_name"] = df["last_name"].str.capitalize()
    # 以食物名为标准去重
    df.drop_duplicates(["first_name", "last_name"], inplace=True)

    print(df)
    展开

    作者回复: Good Job

    
     2
  • 奋斗
    2019-01-07
    老师你好!我是爬虫新手,在为机器翻译提供语料,爬取完数据很头疼,文本数据里有很多问题,老师针对文本类的数据怎么处理好那,pandas适用吗?谢谢了
    
     2
我们在线,来聊聊吧