- 起因: 工作需要处理百万数据,用WPS秒卡死.Mysql数据库虽然可以很好的处理一个表的字段更新问题,但是两个表级联更新也巨慢.百度了下,查到了python,特此记录下,也方便自己往后回查,因为技术不到家的原因,我把这个步骤拆开分成了3个脚本写,如果有大佬看我的文章,愿意教一下我怎么改进,再感激不尽了
- 脚本一: 负责给目的表中那些直接从原始数据表粘贴的字段赋值
import pandas as pd
import csv
# 读取原始数据FileName0.csv,chunksize每次处理的数,iterator是迭代的参数
f_reader = pd.read_csv('./filename.csv',iterator=True,chunksize=10000)
for chunk in f_reader:
# print函数是领导问我进度的时候截图给他看用的,没有这个需求的可以直接删掉.
print(chunk,'\n')
# 把需要用到的字段取出来,可以直接继承的通过pop函数取出来
# 不可以直接继承的,随便写一个值占位置(因为我后面会清空值为空的chunk)
str1 = chunk.pop('str1')
str2 = 'str2'
# 清空chunk,然后将需要继承的字段重新写入chunk
chunk.drop(chunk.index,inplace=True)
chunk.insert(0,'str1_newname',str1)
chunk.insert(1,'str2_newname',str2)
# 清空chunk中值为空的列,然后写入新csv
chunk = chunk.dropna(axis=1)
chunk.to_csv('filename_result.csv',mode='a',header=True,index=None)
# 打印结束提示
print('success')
import pandas as pd
import csv
# 读取脚本1 生成的目标文件filename_result.csv
f_reader = pd.read_csv('./filename_result.csv',iterator=True,chunksize=10000)
for chunk in f_reader:
print(chunk,'\n')
# 提取想要截取字符串所在列
SZD = chunk['SZD']
# (int)强制转化,chunk['SZD']是Series对象无find方法,需要转化为str
str_num = (int)(chunk['SZD'].str.find('号'))
# find方法:能找到的话返回索引值,不能找到的话返回-1
if str_num > 0 : # 有可以截取的字符串才进行截取
chunk['SZD'] = SZD.str[0:str_num]
chunk['SZD'].to_csv('2020_0526.csv',mode='a',header=True,index=None)
print(chunk,'\n')
import pandas as pd
import csv
# 读取脚本1 生成的目标文件filename_result.csv和其他文件file_other.csv
f_reader = pd.read_csv('./filename_result.csv',iterator=True,chunksize=1000)
f_reader1 = pd.read_csv('./file_ther.csv',iterator=True,chunksize=1000)
i = 0
# VLookup功能实现暂时还没有想好怎么写,暂定了几个研究方向,一:两个行循环实现[通过loc提取行数据,然后进行循环,但是这个思路我卡在了loc提取出来的数据是DataFrame类型]
# 二:apply函数,批量处理
# 首先将他们进行字符串化,并得到其对应的布尔值
>>> bool = df.str.contains('Mr\.') #不要忘记正则表达式的写法,'.'在里面要用'\.'表示
>>> print('bool : \n', bool)
# 通过dataframe的基本操作将其选取出来:
>>> filter_data = df[bool]
>>> print('filter data : \n', filter_data)
网友评论