使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重

使用Excel或WPS打开几十万、几百万行数据的文件十分缓慢,进行数据处理很容易卡死崩溃。这几天在处理一份数据文件的时候我尝试边学边用Python,获得了预想的效果。

记录一下处理过程中学到的知识点:

  • 1 删除列
  • 1.2 删除指定列外的其他列
  • 1.2 删除未命名列
  • 2 切分换行:一行转多行
  • 3 替换:对指定列去除转义字符
  • 4 去重后输出
  • * 其他
  • Columns have mixed types. Specify dtype option on import or set low_memory=False.
  • 重命名列名
  • 对某列进行排序去重
  • 导入数据文件

    # Python 3.10.4
    import pandas as pd
    path = r"C:\Users\Administrator\Desktop\test1.csv"
    
    #导入数据文件,文件含有特殊字符,所以采用unicode_escape编码格式
    df = pd.read_csv(path,encoding="unicode_escape",low_memory=False)  
    df
    

    数据情况 : 数据文件包含了网站名称site_short_name、文章标题title、文章URL、话题topics等信息。一个网站有多个话题,多篇文章;同一篇文章会发表在不同的板块,多个板块的信息以数组形式存储在topics字段中;

    数据处理的目的 : 将topics数组切分,去除重复值,最终获得每个网站的topics清单;

    1 删除列

    下载的csv文件会自动分列(只是猜想,不知道是不是这个原因),多了很多冗余列,使用Excel进行列删除直接卡死。用python处理有以下几个方法:

    1.2 删除指定列外的其他列

    删除有列名的列的方法:

    #查看表头
    df.columns
    #方法1:删除指定列
    del df['related_topics']
    
    #方法2:删除指定列
    df = df.drop(['related_topics'],axis=1)
    
    #方法3:保留指定列,适合需要保留的列数量较少的情况(相当于删除其他列)
    test1 = df.loc[:,df.columns.isin(['site_short_name','article_title','article_url','topics'])]
    #另:反选可以加个“~”,如 df.loc[:, df.columns.~isin(['site_short_name','article_title','article_url','topics'])]
    

    1.2 删除未命名列

    更简单的方法:删除没有命名的列。

    但实际上这种说法并不正确,Python并没有”未命名的列”,看起来没有命名的列拥有一个共同的列名“Unnamed”。所以在本案例中,也可以通过删除所有“Unnamed”列一步实现目标。(使用1.1的方法无法删除列名为“Unnamed”的列)

    df = df[df.columns.drop(list(df.filter(regex='Unnamed')))]
    


    也可以采用删除值为“NaN“的方式,可参考Python pandas删除指定行/列数据的方法实例。不过本案例冗余列的值并不都为”NaN",所以不采用这种方法。

    2 切分换行:一行转多行

    话题’topics’是以数组形式存储的,现在想要将话题数据切分,关联上其他字段,形成一行新的记录;

    df = df.set_index(["site_short_name","article_title","article_url"])["topics"].str.split("},{",expand=True).stack().reset_index(drop=True, level=-1).reset_index().rename(columns={0: "topics"})
    

    参考:Pandas行转列、列转行、以及一行生成多行

    3 替换:对指定列去除转义字符

    切分换行后,可以看到’topics‘列包含了“[”、“{”、“}”、“]”这些字符,需要去除。

    test1 = df
    test2 = test1.loc[:,"topics"].str.replace('\[\{','',regex=True).replace('\}\]','',regex=True)
    

    4 去重后输出

    在上一步中,处理完的topics单独为一列了,需要和“site_short_name”、“article_title"、"article_url”合在一起。将处理过的topics值赋给”topics"列;

    test1['topics'] = test2
    


    输出文章清单文件

    df.to_csv(r"C:\Users\Administrator\Desktop\导出结果1.csv",encoding="utf-8")
    

    接下来想要获得网站的topics清单,需要对重复的topics值去重;

    #使用drop删除多列
    test1 = test1.drop(['article_title','article_url'],axis=1)
    
    # 查询命令
    #对所有数据查询重复值
    test1.duplicated()
    #对指定列查询重复值
    test1.duplicated('topics')
    #计算重复值的数量
    test1.duplicated().sum()
    

    #直接对全部数据执行去重操作
    test2 = test1.drop_duplicates()
    #根据某些列去除重复值
    test2=test1.drop_duplicates(subset=['site_short_name','topics'],keep='first')
    

    输出

    df.to_csv(r"C:\Users\Administrator\Desktop\导出结果2.csv",encoding="utf-8")
    

    * 其他

    Columns have mixed types. Specify dtype option on import or set low_memory=False.

    在导入文件的时候,遇到报错

    参考了文章pandas读取CSV文件时出现警告里讲的方法1,较好的方法2无法使用,因为列的数量太多

    重命名列名

    #重命名列名
    df.rename(columns={'site_short_name':'site_short_name'})
    
    #不显示所有数据,查看行数
    len(df)
    

    对某列进行排序去重

    mt =mt.sort_values('yearmonth').drop_duplicates('store_name',keep='last')
    

    参考资料:
    如何选择pandas中除一列之外的所有列?
    python下pandas库中读取指定行或列数据(excel或csv)
    Python pandas删除指定行/列数据的方法实例
    pandas如何删除没有列名的列?
    Pandas行转列、列转行、以及一行生成多行
    Pandas根据字段(列)查看具体有哪些重复的数据
    Pandas之drop_duplicates:去除重复项

    来源:渫渫不在乎

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重

    发表评论