使用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字段中;
使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重_第1张图片

数据处理的目的 : 将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')))]

使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重_第2张图片
也可以采用删除值为“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 替换:对指定列去除转义字符

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

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

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

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

4 去重后输出

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

test1['topics'] = test2

使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重_第5张图片
输出文章清单文件

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()

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

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

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

输出

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.

在导入文件的时候,遇到报错
使用Python处理百万数据量的Excel文件:删除列、切分换行、替换去重_第8张图片
参考了文章pandas读取CSV文件时出现警告里讲的方法1,较好的方法2无法使用,因为列的数量太多

重命名列名

#重命名列名
df.rename(columns={'site_short_name':'site_short_name'})

#不显示所有数据,查看行数
len(df)

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

对某列进行排序去重

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


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

你可能感兴趣的:(Python,python,pandas,数据分析)