使用Excel或WPS打开几十万、几百万行数据的文件十分缓慢,进行数据处理很容易卡死崩溃。这几天在处理一份数据文件的时候我尝试边学边用Python,获得了预想的效果。
记录一下处理过程中学到的知识点:
导入数据文件
# 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清单;
下载的csv文件会自动分列(只是猜想,不知道是不是这个原因),多了很多冗余列,使用Excel进行列删除直接卡死。用python处理有以下几个方法:
删除有列名的列的方法:
#查看表头
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'])]
更简单的方法:删除没有命名的列。
但实际上这种说法并不正确,Python并没有”未命名的列”,看起来没有命名的列拥有一个共同的列名“Unnamed”。所以在本案例中,也可以通过删除所有“Unnamed”列一步实现目标。(使用1.1的方法无法删除列名为“Unnamed”的列)
df = df[df.columns.drop(list(df.filter(regex='Unnamed')))]
也可以采用删除值为“NaN“的方式,可参考Python pandas删除指定行/列数据的方法实例。不过本案例冗余列的值并不都为”NaN",所以不采用这种方法。
话题’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行转列、列转行、以及一行生成多行
切分换行后,可以看到’topics‘列包含了“[”、“{”、“}”、“]”这些字符,需要去除。
test1 = df
test2 = test1.loc[:,"topics"].str.replace('\[\{','',regex=True).replace('\}\]','',regex=True)
在上一步中,处理完的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")
在导入文件的时候,遇到报错
参考了文章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:去除重复项