经常 我们在处理小数据集是 不想用大刀,逮住了excel 就想 一直拖拖拉拉就把数据先处理一下,实在处理费力,再从 python numpy pandas 处理一通。
常见的 在处理五要素的时候,姓名基本没啥要处理的,
1.身份证号 手机号 银行卡号 经常是 显示为 E+17 或者 前面带有 ``` 字符
2.申请日期经常是各种格式,有时候一不小心就变成乱码的数字 后者####。
3.如果 excel 有外部链接存在,即使忽略,但是 在修改的时候还是非常糟心,要等很久,而且经常无法保存,excel就崩溃了
4.还有就是 本身就是文本,但是使用 TEXT LEFT RIGHT MID IF 没有任何效果
5.excel 读取 含有中文的数据显示乱码
6.多条件的替换问题,if嵌套。
7.批量 替换 匹配
8.空值问题
9.筛选问题
10.脚本读取文件
其实就是以上的这些小情况,经常浪费大量时间,急需一招狠制敌
接着说 1.
因为很多时候 excel会把一些类数值的身份证号和手机号当做数字,这个其实是数据源在使用python处理的时候没有来得及保存 对应列的 数据类型。
在出现 E+17,我们首先想到的是修改 单元格格式,比如保存为文本,假如正常那简直是万幸,如果不可以,可能会发现 修改后的数据末尾都变成了3个零。
另外一个终极方法
这里,有一个简单的操作方法:选择数据源——右键设置单元格格式——自定义——选择0,按确定——结果出来了。结果很明显,是我们需要的效果,而且快捷,方便。
另外就是使用python pandas读取 ,设置 dtype=np.str
对于 身份证或者手机号 银行卡号 数据首位出现 【`】字符的,可以使用 RIGHT MID 函数做数据的截取
对于数据出现 ###,一般修改单元格格式 ,或者 拉长单元格,或者 python读取一下就可以处理
最后就是说2了。日期
其实这个日期,就是格式太特么的多和复杂不固定。我们现在 使用的是 类似 2018-4-17 这种格式,所以只要不符合这种格式的,我们都会需要做一些转化,
最简单的 就是使用 TEXT 函数 ,一般这样用 =TEXT(E2,"yyyy-mm-dd")
基本就可以转化过来。
如果以上不起作用 参考 处理 4 的方法 不断尝试 ,最后确认函数真的不会起作用为止。
之后如果 不小心 变成一段数字了,修改单元格格式,转回日期一般是有效的。
如果日期 函数不起效果,我们使用截取 拼接的方式 使用 RIGHT LEFT MID
CONCATENATE() 这些函数 一般也可以胜任
def to_date_yl(x):
try:
a = pd.to_datetime(str(x),format='%Y%m%d')
j = (today - a).days
except:
j = np.nan
return j
如果 还是不行也可以 使用 YEAR() DATE() EXCEL 本身的日期处理函数
另外就是修改单元格格式 ,尝试一下各种日期格式是否可以满足要求
另外的杀手锏就是 python pandas 和numpy都有 时间处理的函数
可以参考
推荐阅读
https://segmentfault.com/a/1190000011145901
https://blog.csdn.net/ly_ysys629/article/details/73822716
下面分别说一下 。先说 3
这种带外部链接存在的,曾经尝试过全文copy 新的 sheet 甚至是新的excel文件,但是还是崩溃,所以还是使用python 的pandas 。在使用pandas 读取后,根据列名 筛选后,另存为新的excel 文件或者csv文件 ,这样一般不会有 问题,顺利解决,一般文件也变小。
再说 4.
对于 使用函数 并不起作用的列,一般 情况 可能单元格 格式不是文本,可以先修改单元格格式转为文本后再尝试,
假如还是失败,则 复制该列,选择有选择粘贴 只要值,在进行函数尝试 ,
如果还是失败,则 新建一个sheet ,在复制 有选择粘贴 只要值,再进行函数尝试,
如果还不行,则新建 excel 再复制有选择的粘贴 只要值。在进行函数尝试,
假如还不可以 则使用python pandas 读取,并设置 dtype=numpy.str,
如果还是不可以,数量少自己手动改,数量多 则请求数据源从新整。
另外 还可以尝试 另存为比如csv 格式 或者使用python 另存为 其他新文件或者csv,再尝试读取 函数修改
之后说5
Excel 读取汉字乱码 ,sublime 也乱码
可以使用 python pandas 读取 ,
如果 utf-8 不行 ,就转 gbk
另外就是 excel 读取没有乱码 ,但是 在 Terminal 终端 读取 中文又乱码了,怎么办 ,当然 好办,excel 保存为csv 或者txt ,使用sublime 或者notpad ++ 打开 ,选择 标题栏 【FILE] 下拉框里 选择【Save with Encoding 】,选择 第一个 【UTF-8] 或者 【UTF-8 NO BOM],则再次在终端命令行读取 ,中文可以正常显示。
说说 6 多条件 替换
一定要 主要了 如果 if 的condition 是 比较数值,这个不用使用单引号 双引号,
如果condition是 文字 匹配的话,切记 一定要使用英文下的双引号,否则 报错,英文下的单引号也会报错。if 嵌套可以很多个if 像套娃一样套着,另外 if 还可以和 AND OR 一起配合着使用
比如
=IF(K2="坏","1",IF(K2="已还","-1",IF(K2="","0",IF(K2=" " ,"0","F"))))
=IF(C9>15000,20%,IF(C9>12500,17.5%,IF(C9>10000,15%,IF(C9>7500,12.5%,IF(C9>5000,10%,0)))))
=IF(B2>97,"A+",IF(B2>93,"A",IF(B2>89,"A-",IF(B2>87,"B+",IF(B2>83,"B",IF(B2>79,"B-", IF(B2>77,"C+",IF(B2>73,"C",IF(B2>69,"C-",IF(B2>57,"D+",IF(B2>53,"D",IF(B2>49,"D-","F"))))))))))))
还要说7
对于 批量替换 匹配的,这个真是excel 函数最大的魔力。设置好函数后,回车显示好效果,没问题的就直接双击 黑实心十字 【+】,然后这个函数就会作用到整列,需要注意的就是 如果该列有空值的话,经常会阻隔函数的继续执行 ,需要我们 大概手动在拖拉一下,再双击 之后的。
8空值的处理
由于我们经常是胡子嘴巴一起抓,excel 和python 经常会遇到处理空值的问题,关键空值还不太统一 ,有 "" " " "\t" nan null None ,几种,需要我们不断归一为一种,有时候 excel 没有 python pandas 处理默认就变成 NAN,如果不小心保存了,在新打开 excel文件就都有 NAN 或者nan ,需要我们处理
出现 这个
ValueError: empty string for float() data = data.fillna('')
data["field"].isnull
data.dropna()
Pandas 在读取的时候 加一个 参数 dtype=np.object
9.另外 excel 本身有很多很简单 也超级好用的工具箱
最好用的就是筛选 ,可以比较数值 ,是否包含字符,长度 来做筛选,
另外 比较好用的是 vlookup 这个函数 ,其实比较高大上,用好了 非常节省时间
另外是 比如删除 重复项 , 合并计算 模拟分析 排序,
【公式】 【数据】 是 留给数据分析师最好的武器
10.比如我们的小数据经常还是需要存储到hive 库中,大部分我们会写一个脚本
来etl 并执行 hive -e hql ,然后使之可以批量 存储。有时候 读取 txt文件 会出错 ,比如 列 粘连了, 其实 可以把excel 另存为 csv 格式 ,这样可以避免 列粘连。
大部分我们的脚本都会ftp上传到服务器上,有时候很大,好不容易上传了, 发现文件还是有点错误 ,比如 列名header 应该去除没有去除,比如数据末尾多了好多空行 ,比如 需要批量replace ,需要你 可以 熟练使用 vim 或者 emacs ,最好 安装 python3.6 ptpython pandas numpy sklearn 等常用的包
- 有时候 我们 某一列都是 同一 文字,如果是 中文的话 使用 =TEXT(E2,"哈哈")
如果同一文字是英文 的话,使用 text 可能不会有效果,可以使用 IF()进行赋值
以上基本上是 使用excel 会遇到的80%的比较恶心的问题,如果解决了这些,基本上 可以节约很多时间