找回密码
 立即注册
搜索
查看: 4129|回复: 36

[软件] 50万行数据处理方法求指南

[复制链接]
     
发表于 2021-4-6 09:07 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 天知道 于 2021-4-12 14:51 编辑

公司记录,57万行,950列(其中有约150列列名是名字略有差异,如多个空格,英文中文逗号不同,但实际东西是一个;这是因为这些记录前后录入人员不固定出现一个东西多个命名);excel文件大概170MB,导出csv约700mb。
目标是将其中一列数据标准化(此列同样物品被命名了n个不同写法),基本上只能遇过排序、查找等方法小批量手动改,以前改过一些,使用excel很方便,现在数据太多,excel查看可以,搜索过滤太慢,想找一个类似于excel操作方法的。
pandas在学,这个excel文件就是用concat组合45个老excel文件形成的,但感觉不太直观,而且对于批量修改某些行的某个列不熟。
sqlite也试过导入csv,但它对列名有要求,不能用 - 号,会改成 _ ,这个会混淆。filemaker同上,因为最后我要导出成excel,让我再改800个列名………

210412更新:根据楼里同学的指导尝试用pandas处理,目前遇到的坑:csv比xls占内存大多了,读取csv直接把我16gb内存占光,读取xls就占了4个G不到,用pickle保存的文件也差不多大小
回复

使用道具 举报

     
发表于 2021-4-6 09:19 | 显示全部楼层
poi?
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-4-6 09:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-4-6 09:30 来自手机 | 显示全部楼层
50万行的数据加工还是pandas最方便吧
回复

使用道具 举报

头像被屏蔽
发表于 2021-4-6 09:37 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-4-6 09:37 | 显示全部楼层
jupyter notebook跑pandas吧,中间结果还能存起来,这不是好用得很么
回复

使用道具 举报

     
发表于 2021-4-6 11:03 | 显示全部楼层
要不抽个1w行,950列的数据上传过来, 我帮你看看
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-4-6 11:21 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-4-6 11:55 | 显示全部楼层
感觉还得pandas
回复

使用道具 举报

     
发表于 2021-4-6 12:09 | 显示全部楼层
6楼正解
回复

使用道具 举报

     
发表于 2021-4-6 12:19 | 显示全部楼层
pandas很好解决吧
回复

使用道具 举报

     
发表于 2021-4-6 12:22 来自手机 | 显示全部楼层
列名会混淆就改列名啊  我没基础,觉得还是sql好用
回复

使用道具 举报

     
 楼主| 发表于 2021-4-6 12:36 来自手机 | 显示全部楼层
skill 发表于 2021-4-6 09:37
jupyter notebook跑pandas吧,中间结果还能存起来,这不是好用得很么

这个数据量用jupyter中间保存不会太慢吗?45个excel合并保存用了约45分钟
谢谢楼上各位

—— 来自 Xiaomi Redmi K30 Pro, Android 11上的 S1Next-鹅版 v2.4.4.1
回复

使用道具 举报

     
 楼主| 发表于 2021-4-6 12:37 来自手机 | 显示全部楼层
marrrk 发表于 2021-4-6 11:03
要不抽个1w行,950列的数据上传过来, 我帮你看看

不好意思,数据不能外传。谢谢

—— 来自 Xiaomi Redmi K30 Pro, Android 11上的 S1Next-鹅版 v2.4.4.1
回复

使用道具 举报

     
发表于 2021-4-6 12:41 | 显示全部楼层
以前处理过二十多万条的用mysql加python解决了,openpyxl直接导入xls用数据库命令处理,合并标准化和筛选都挺方便就是得花时间写代码,需要的时候再导出xls就是了,效率还行
回复

使用道具 举报

     
发表于 2021-4-6 13:27 | 显示全部楼层
天知道 发表于 2021-4-6 12:36
这个数据量用jupyter中间保存不会太慢吗?45个excel合并保存用了约45分钟
谢谢楼上各位

写个python先把45个csv合并了,操作一个就快多了。中间数据存成pkl,快的很
回复

使用道具 举报

     
 楼主| 发表于 2021-4-6 14:08 来自手机 | 显示全部楼层
skill 发表于 2021-4-6 13:27
写个python先把45个csv合并了,操作一个就快多了。中间数据存成pkl,快的很

我已经合并了,csv大小是700m,就是怕对这个文件操作中要存盘时很慢。kpl是什么格式?

—— 来自 Xiaomi Redmi K30 Pro, Android 11上的 S1Next-鹅版 v2.4.4.1
回复

使用道具 举报

     
发表于 2021-4-6 14:15 | 显示全部楼层
天知道 发表于 2021-4-6 14:08
我已经合并了,csv大小是700m,就是怕对这个文件操作中要存盘时很慢。kpl是什么格式?

—— 来自 Xiaomi ...

csv读进python,在python里处理好再存成csv或xlsx就可以了,只有读取和导出的时候涉及硬盘IO会有点慢,中间处理都是在内存里,很快的
之前用python折腾千万行量级的数据都不算太卡,这个50万行应该更轻松了
回复

使用道具 举报

     
发表于 2021-4-6 14:25 | 显示全部楼层
天知道 发表于 2021-4-6 14:08
我已经合并了,csv大小是700m,就是怕对这个文件操作中要存盘时很慢。kpl是什么格式?

—— 来自 Xiaomi ...

pkl就是pickle库存储的内存二进制文件,存和取都非常快。具体可以上网查查。用pandas把csv读成pd之后就直接存一个pd的pkl文件。下次直接加载这个pkl文件,比你读csv可快多了
只要你内存大,处理这些pkl基本都不耗时的
回复

使用道具 举报

     
发表于 2021-4-6 15:26 | 显示全部楼层
pandas处理然后hdf5保存吧,csv这种读写确实都慢
回复

使用道具 举报

     
发表于 2021-4-6 15:45 | 显示全部楼层
就pandas正常改把,列名你可以先自己把-改成随便一个占位的最后再把他改回来
回复

使用道具 举报

     
发表于 2021-4-6 16:01 来自手机 | 显示全部楼层
sed
回复

使用道具 举报

     
 楼主| 发表于 2021-4-6 16:25 来自手机 | 显示全部楼层
好的,谢谢楼上各位,我去学习下

—— 来自 Xiaomi Redmi K30 Pro, Android 11上的 S1Next-鹅版 v2.4.4.1
回复

使用道具 举报

     
发表于 2021-4-6 18:09 | 显示全部楼层
pandas自然可以,但是看主贴需求仅仅只是把物品名称统一一下,只要你设计好转换函数,python直接读取csv套个循环应用转换函数不一样能解决吗,都不需要上pandas。
至于导入到sql的列名问题,一样可以用上述方法转换列名,怕忘记了大不了将对应关系找个文件存起来就好了,都不需要手动啊。
回复

使用道具 举报

     
 楼主| 发表于 2021-4-6 18:39 | 显示全部楼层
糊状物 发表于 2021-4-6 18:09
pandas自然可以,但是看主贴需求仅仅只是把物品名称统一一下,只要你设计好转换函数,python直接读取csv套 ...

就是这个物品名称转换太麻烦了,同一个物品有N种叫法,还有混淆的,我的不入门编程根本没法处理,只能手动转。
回复

使用道具 举报

     
发表于 2021-4-9 02:12 来自手机 | 显示全部楼层
没有比pandas更简单的方案了,估计就是3行代码的事,读csv,替换,写回
回复

使用道具 举报

     
 楼主| 发表于 2021-4-9 06:36 | 显示全部楼层
本帖最后由 天知道 于 2021-4-9 06:46 编辑
KH2841 发表于 2021-4-9 02:12
没有比pandas更简单的方案了,估计就是3行代码的事,读csv,替换,写回

我举个例子,我需要修改的列中有如下数据:
1.美孚600 XP 320
2.美孚320号齿轮油(后面的一列中标明其倾点为-21℃)
3.美孚632
4.美孚600XP320
5.美孚CKD 320
6.美孚CKD320
7.美孚SHC 320
8.美孚SHC 632
9.美孚320合成齿轮油
10.美孚320号齿轮油(后面的一列中标明其倾点为-42℃)
11.mobil SHC 632


其中1到6实际是一个东西,7到11是另一个东西;而且以上还没有把所有可能的名字全列出来。这玩意有办法写替换代码吗?

回复

使用道具 举报

     
发表于 2021-4-9 07:21 来自手机 | 显示全部楼层
pandas

—— 来自 samsung SM-G9910, Android 11上的 S1Next-鹅版 v2.4.3
回复

使用道具 举报

     
发表于 2021-4-9 07:32 来自手机 | 显示全部楼层
非码农,平时稍微用点pandas处理文档
看看这样行不
import pandas as pd
Df=pd.read_csv(xxx)
Df[列名]=Df[列名]. map(f)
Df.to_excel()

def f(x):
     … #修改数据
    return 处理完的数据



—— 来自 samsung SM-G9910, Android 11上的 S1Next-鹅版 v2.4.3
回复

使用道具 举报

     
 楼主| 发表于 2021-4-9 07:42 | 显示全部楼层
kinta 发表于 2021-4-9 07:32
非码农,平时稍微用点pandas处理文档
看看这样行不
import pandas as pd

f(x)使用多对一的词典那种方式吗?还是正则?
这块我真的有点摸不着头脑。我在想是不是将以前修改过的记录(两列,一列是随便命名的,另一列是我手动标准化命名的)提取记录,形成这样一个词典之类的,然后进行比对。我得查查。
回复

使用道具 举报

     
发表于 2021-4-9 08:01 | 显示全部楼层
天知道 发表于 2021-4-9 06:36
我举个例子,我需要修改的列中有如下数据:
1.美孚600 XP 320
2.美孚320号齿轮油(后面的一列中标明其倾点 ...

如果你已经知道所有的可能组合,那么直接判断就可以了,否则还得用正则
回复

使用道具 举报

     
发表于 2021-4-9 08:03 | 显示全部楼层
借地方问一下,对象单位一个excel将近1G了,里边数据不多,都是各种手机拍的图片,这种怎么处理好?
之前试过用excel自带的压缩图片处理,但是画质压得太差了,是不是单独找个地方存图片然后超链接?
回复

使用道具 举报

     
发表于 2021-4-9 08:04 | 显示全部楼层
天知道 发表于 2021-4-9 06:36
我举个例子,我需要修改的列中有如下数据:
1.美孚600 XP 320
2.美孚320号齿轮油(后面的一列中标明其倾点 ...

如果列值就这么些不会再增加了或者你就做这么一次 可以set处理一下看一下所有的列值然后替换 要不然估计还是得写函数写正则啥的
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-4-9 08:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-4-9 08:32 来自手机 | 显示全部楼层
天气姐姐 发表于 2021-4-9 08:03
借地方问一下,对象单位一个excel将近1G了,里边数据不多,都是各种手机拍的图片,这种怎么处理好?
之前试 ...

纯卸图片不需要整理的话改名解压大法就能解决,如果需要连带数据一起处理那最优解可能是vba遍历后另存

—— 来自 Xiaomi M2011K2C, Android 11上的 S1Next-鹅版 v2.4.4.1
回复

使用道具 举报

     
发表于 2021-4-9 15:04 | 显示全部楼层
天知道 发表于 2021-4-9 06:36
我举个例子,我需要修改的列中有如下数据:
1.美孚600 XP 320
2.美孚320号齿轮油(后面的一列中标明其倾点 ...

手动写字典把,这种没规律的,编程救不了你
有规律的,正则还能处理一些
回复

使用道具 举报

     
发表于 2021-4-9 16:22 | 显示全部楼层
天知道 发表于 2021-4-9 07:42
f(x)使用多对一的词典那种方式吗?还是正则?
这块我真的有点摸不着头脑。我在想是不是将以前修改过的记 ...

就是一个函数,对这一列的每一个数据做处理,可以用正则,也可以用一堆if来搞,最后return你处理完的数据
比如你把某一列数据里'-'改成'_',就
def f(x):
    x=re.sub('\-','_',x)
    return x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-12 11:49 , Processed in 0.200688 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表