• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
渫渫不在乎
帮助1

使用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清单;
学新通

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:去除重复项

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfabki
系列文章
更多 icon
同类精品
更多 icon
继续加载