问题
哎哟,每周都被电商平台的那些巨大CSV电子表格折磨得头疼不?别担心,小编来给你支招啦!这些表格动不动就超过两百万条数据,用电脑上的Office软件打开,简直就像在看一部超长预告片,还得等上个5分钟,而且只能看到一半的内容,分分钟还可能给你玩个“崩溃大礼包”,让人欲哭无泪。
但其实呢,我们真正关心的,只是那些跟咱们公司产品有关的关键词数据,其他的都是“打酱油”的。想想看,每次打开这些大山一样的文件,我们是不是都在浪费时间,去找那么几颗“珍珠”?
好消息是,我们有秘密武器——Python!用Python程序脚本搞定这个任务,既高效又省心。所以,下次当这些“数据巨无霸”又来找麻烦时,别忘了我们的脚本小能手,让它帮你轻松筛选出那些关键信息,让你的工作效率像坐火箭一样飙升!
分析问题
好啦,咱们来轻松搞定这个任务!其实就是“读取-筛选-保存”这么简单。不过呢,这些文件有点儿特别,数据多得像银河里的星星,一打开office软件,它就得全部加载完才能动弹,再加上那些花哨的图形界面和工具,内存一下就不够用了,电脑小脸一蓝,直接给你来个“死机表情包”。
但咱们有高招儿——脚本程序!这小家伙儿不用图形界面,轻装上阵,直接从电子表格里抓数据,又快又省心。最神奇的是,它还能挑着读取数据,不用一股脑儿全塞进内存,这样一来,电脑就不会因为“吃太多”而闹脾气了。详细流程图如下:
代码实现
1.分批读取数据
第一件事情,根据输入的文件夹地址,遍历里面的文件,找到所有CSV表格,然后读取数据。由于是大文件数据,因此不能一次性全部读取,借助skiprows和nrows参数能够控制读取数据量,第一个是跳过的数据行数,第二个是读取数据行数。比如第一次读取五万行,则skiprows=0和nrows=50000,第二个五万行,skiprows=50000,nrows=100000,依此类推可以分批全部读取,例子代码如下。
# 当前文件夹路径
current_directory = os.path.dirname(os.path.abspath(__file__))
res_df = pd.DataFrame()
print("正在搜索文件夹:", current_directory)
for file in os.listdir(current_directory):
if file.split(".")[-1] == "csv":
data_file_path = os.path.join(current_directory, file)
step = 5e4 # 科学记数法 50000
max_row = 1e6 # 一百万
row_number = 1 # 本文档第一行没有用途,直接跳过
# 读取文件,由于文件较大,skiprows代表忽略行数,nrows可以指定获取数据行数
while row_number < max_row:
df = pd.read_csv(data_file_path, encoding="gbk", skiprows=row_number, nrows=row_number+step)
# 暂时不进行数据处理
print(df.head())
row_number += step
print(row_number, step)
# 读取小量数据调试,这里循环一次就结束,正确后再读取全部数据
row_number += step
### 输出 #######
正在搜索文件夹: D:\PythonProjects\自动化书代码用例\第四章-数据分析\4-9-电商关键词
搜索频率排名 搜索词 ... 点击量最高的商品 #3:转化份额 报告日期
0 1 valentines day gifts for her ... 0.97 2022/2/12
1 2 valentines day gifts for him ... 1.89 2022/2/12
2 3 valentines cards for kids classroom ... 0.88 2022/2/12
3 4 reacher ... 0.00 2022/2/12
4 5 valentines day gifts for kids ... 1.55 2022/2/12
[5 rows x 21 columns]
50001.0 50000.0
从输出结果得知,数据是按搜索频率排名进行排序,数据越靠前,证明越多用户搜索,相关商品的需求量越大。查看代码,你会发现有一个不常见数值5e4和1e6,这是科学记数法,e后面数字n代表10的n次方,通俗说就是数值后面带多少个0。因此5e4为50000,也就是五万,这样避免输入错误,也能避免阅读代码错误。
注意:调试阶段,不需要把整个文档都读取,因此用了break,正式执行代码需要删掉。
关键数据提取
从上面的结果中发现每一行有21列数据,其中第二列搜索词就是我们筛选关键词的需要比较的数据,因此筛选数据的条件也是在搜索词这一列进行,代码如下。
# 关键词
search_key = "ipad"
# 根据关键词筛选
# 第一种关键词完全一致的数据
df_key = df[df["搜索词"] == search_key]
print(df_key.head())
### 部分结果输出 ####
搜索频率排名 搜索词 点击量最高的品牌 #1 ...
21 22 ipad Apple ...
[1 rows x 21 columns]
从输出结果得知,找到一条ipad搜索词的数据。若有多个关键词,可以通过列表保存关键词,然后遍历列表数据,替换search_key便可完成全部关键词的提取工作。
3.汇总数据与保存
使用pd.concat()函数,可以把数据按行合并,最后使用to_csv()把汇总数据输出到电子表格中,具体代码如下。
# 创建一个新的Dataframe数据
res_df = pd.DataFrame()
# 合并数据
res_df = pd.concat([res_df, df_key])
print(read_df)
# 保存为文档
res_df .to_csv("关键词集合.csv")
获取完整代码
可以添加微信公众号,回复"超大文件读取"