Python踩坑王(第一期)数分大坑:恼人的空格——又名:为什么所有教材总是不厌其烦得强调一定要先做数据清洗

原创,未经授权请勿转载!
开发基于python3.7(非Python2);
IDE是pycharm2019社区版(足够用了);
侵删!侵删!侵删!重要的事情要说三遍。

昨天朋友用pandas做两表的合并,本来很简单的一个操作,两秒就能搞定,他却愣是做了一上午,踩了一上午坑,后来源文件发给我,我才找出了问题所在,那就是:

** 空格,空格,空格!**

坑:

原始文件是这样两张表:
在这里插入图片描述
内容分别是:
nodos.xlsx
在这里插入图片描述
city_data.xlsx
在这里插入图片描述
概括来讲就是把B表中的纬度和经度取出来,对应到A表的城市,看起来十分简单。

掉坑的代码:

# coding:utf-8
# python 3.7
import pandas as pd
l = pd.read_excel("nodes.xlsx")
r = pd.read_excel("city_data.xlsx")
print(l,r)
result = pd.merge(l,r,left_on="Label",right_on="城名",how='left')
result.to_csv("result.csv",encoding='ANSI')
print(result)

简单明了,确实2秒搞定。

可问题出现了……

打开结果csv文件,发现
在这里插入图片描述
像“北京”这种明显在B表中有的,却并没有传递到A表。

就这么简单的问题,困扰了朋友好久,我也是看了半天才发现了问题。

坑位本质

看这里:
A表中似乎有两个"北京”
在这里插入图片描述
在这里插入图片描述
这两个北京,在肉眼上很难分辨出来有什么差异,而且朋友用print打印出来之后,也没看出什么差别。
但在pandas判断是,这俩完全不同,
一个是,“北京”
另一个是,"北京 "(后边多了一个空格)

在pandas看来,这两个cell里的值,是不一样的,所以就会导致匹配不到。
这也就是为什么学数分的时候,几乎所有的教材都在强调,数据分析之前,一定要做数据清洗。
虽然只是一个小问题,但是如果没有踩过这个坑,真的很难发现,如果是分析工作做完了才发现这个问题,那后果可就很严重了。
小可爱们要引以为戒。
附上添加清洗空格操作后的代码:

# coding:utf-8
# python 3.7
import pandas as pd
l = pd.read_excel("nodes.xlsx")
#生成一个新列,把原列的空格取出后,传递给新列,使用新列作为连接的键
l['newLabel'] = l["Label"].str.strip()
r = pd.read_excel("city_data.xlsx")
#生成一个新列,把原列的空格取出后,传递给新列,使用新列作为连接的键
r['new城名'] = r["城名"].str.strip()
print(l,r)
result = pd.merge(l,r,left_on="newLabel",right_on="new城名",how='left')
result.to_csv("result.csv",encoding='ANSI')
print(result)

最后留一个思考题:
如果是df格式的columns索引上,有这种多余的空格,两表合并的时候会发生什么呢?
友情提示:
答案从一个著名的数学家名字上找。
我们下回踩坑见啦
梁峻

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值