其他
数据治理 | 超大.csv文件怎么处理?我们有独门武器!(免费赠送自制csv切分工具)
目录 一、前言
二、问题背景
三、使用 CSV 切分工具
四、Stata 解决方案
获取数据量
(1)查看变量(字段)
(2)获取观测数
分批统计信息
五、Python 解决方案
获取数据量
(1)获取数据行数
(2)查看数据字段
处理数据
六、总结
我们贴心地为大家准备了团队自制的CSV切分工具,关注本公众号,后台回复“20220520”即可免费获取自制 CSV 切分工具!
Part1前言
Part2问题背景
Part3使用 CSV 切分工具
第 ① 步
第 ② 步
第 ③ 步
输入切分行数后,点击【开始切分】按钮,程序就开始切分数据了。切分完成后如下图所示:
💡 这个工具是我们团队自制的,目前还有改进的空间,我们制定了初步的改进计划:
1. 数据文件导入后,显示字段名;2. 根据某个字段的取值,分类切分。比如按照性别或省份对数据进行切分。
欢迎广大读者向我们提出新的需求或想法,如若条件允许我们将会进一步更新!(扫描下方二维码添加小编
Part4Stata 解决方案
1获取数据量
(1)查看变量(字段)
// csv 文件路径
local csv_path = "C:\data.csv"
// rowrange(1:5):导入前五行数据(含表头)
import delimited `csv_path', varnames(1) encoding(UTF-8) rowrange(1:5)
(2)获取观测数
clear
// 数据路径
local csv_path = "C:\data.csv"
// 初始行
local startline = 1
// 每次读取的行数
local read_lines = 1000
local step = `read_lines' - 1
// 终止行
local endline = 0
// 统计总行数
local lines = 0
while 2 > 1 {
local startline = `endline' + 1
local endline = `startline' + `step'
import delimited `csv_path', varnames(nonames) encoding(UTF-8) rowrange(`startline':`endline')
// 统计总行数
local lines = `lines' + _N
if `step' > _N {
clear
continue,break
}
clear
}
// 输出数据总行数(含表头)
di "当前 csv 文件总行数(含表头)为:" `lines'
2分批统计信息
clear
// file
local csv_path = "C:\data.csv"
// 初始行
local startline = 1
// 读取行数
local read_lines = 10000
local step = `read_lines' - 1
// 终止行
local endline = 0
// 统计 "浙江省" 专利数量
local zhejiang_lines = 0
while 2 > 1 {
local startline = `endline' + 1
local endline = `startline' + `step'
import delimited `csv_path', varnames(1) encoding(UTF-8) rowrange(`startline':`endline')
local now_lines = _N
// 统计浙江
keep if regexm(省份, "浙江省") == 1
local zhejiang_lines = `zhejiang_lines' + _N
if `step' > `now_lines' {
clear
continue,break
}
clear
}
di "浙江省专利数量为:" `zhejiang_lines'
clear
Part5Python 解决方案
1获取数据量
(1)获取数据行数
open
即可在不将数据读入内存的前提下获取 csv 的行数,代码如下:Path = '专利数据.csv' # 数据路径
for count, line in enumerate(open(Path, "rU")):
# count 表示数据处于csv的第几行,line 是这一行的数据值
pass # 每次只读一行数据,但不做任何操作
print(count) # 输出最终获取到的数据行数(不含表头)
(2)查看数据字段
import pandas as pd
# 大 csv 数据的存储路径
Path = r'专利数据.csv'
# nrows=5 表示只读取 csv前 5行数据
pd.read_csv(Path, nrows=5)
2处理数据
pd.read_csv()
读取数据时传入参数 chunksize
来生成一个 TextFileReader
对象,该对象把一个大数据集分割为若干个小数据块。每个数据块的数据行数就是我们传入的 chunksize 参数值。我们循环读取所有数据块(每次只读取其中一个小数据块到内存中),并统计这个小数据块的数据信息。这样就解决了问题,最后我们累计所有的统计结果就可以完成统计任务了。# 为了节省内存,我们可以只读取需要的字段
# chunksize=100000 表示每次只读 100000 行数据
path = r'专利数据.csv'
DATA = pd.read_csv(path, usecols=['省份'], chunksize=100000)
Counts = dict() # 创建一个空字典,用于存储各省份专利数量
for data in tqdm(DATA):
'''从DATA中每次获取一个小数据集'''
# 每个小数据集分别统计省份专利分布
counts_dict = data['省份'].value_counts().to_dict()
for name, num in counts_dict.items():
if name in Counts.keys():
Counts[name] += num
else:
Counts[name] = num
# 累加得到统计值的总和,可以验证是否统计了全部数据
# 若结果等于大数据集的行数,说明已经统计了全部数据的专利分布
print(sum(list(Counts.values()))) # 输出:36996264
array = [[k,v] for k,v in Counts.items()]
Target = pd.DataFrame(array, columns=['省份', '专利数量'])
# 根据专利数量排序,由大到小
Target = Target.sort_values(by='专利数量', ascending=False)
Target.head(8)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 设置字体为楷体
plt.rcParams['figure.figsize'] = (10, 5) # 调整生成的图表最大尺寸
plt.rcParams['figure.dpi'] = 500 # 每英寸点数
# 设置横轴标签
xticks_labels = ['\n'.join(N) for N in Target['省份']]
xticks(np.linspace(0,34,34,endpoint=False), xticks_labels)
# 设置纵轴标签
yticks_labels = ['{}百万'.format(i) if i > 0 else '0' for i in range(0,7)]
yticks(np.linspace(0,6000000,7,endpoint=True), yticks_labels)
# 绘制柱状图
plt.bar(Target['省份'],Target['专利数量'])
# 设置图标题
plt.title('全国专利分布')
plt.show()
PS:Windows 用户可以在任务管理器中,依次点击 左下角【详细信息】—【性能】—【内存】来查看计算机内存的使用率,空间变化等,如下图所示:
Part6总结
我们贴心地为大家准备了团队自制的CSV切分工具,关注本公众号,后台回复“20220520”即可免费获取自制 CSV 切分工具!
我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块(点击标题即可跳转至相应合集):
星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!
点击搜索你感兴趣的内容吧
往期推荐
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
文 | 《社科领域大数据治理实务手册》
欢迎扫描👇二维码添加关注