python两表连接数据处理的小技巧--merge

来源:互联网 发布:js判断只能输入数字 编辑:程序博客网 时间:2024/05/20 01:11

  • python两表连接数据处理的小技巧merge
    • python环境创建
    • 本地读取

python两表连接数据处理的小技巧–merge

​ 今天在工作的时候, 碰到两个表需要做连接, 很简单的问题, pd.merge就可以解决问题. 但是在检查数据的时候却发现很多没有merge上, 明明要连接的字段在两个表中都有记录, 为什么merge出来的结果有缺失呢?仔细检查数据才发现, 有些数据字段是以0开头的, 例如0021等. python在读取这些数据的时候会忽略掉最前面的多个0, 所以会出现上述情况?

​ 这个问题该怎么处理? 其实很简单, code最容易直观说明与解决问题了.

1. python环境创建

data1 = pd.DataFrame({'id': ['001','002','031','421'], 'name':['alice','bruce','cook','daisy']})data1

Out[1]:

id name 0 001 1 002 2 031 3 421
data1.dtypes

Out[2]:

id      objectname    objectdtype: object
data2 = pd.DataFrame({'id': ['001','002','031'], 'label':[1,2,3]})data2

Out[3]:

id label 0 001 1 002 2 031
merge_data1 = pd.merge(data1, data2, on='id',how='left')merge_data1

Out[4]:

id name label 0 001 alice 1 002 bruce 2 031 cook 3 421 daisy

2. 本地读取

这个输出没有什么问题, 和预想的结果保持一致;

接着, 我们创建两个临时数据data1data2 , 然后我们另存, 改为从本地读取文件, 看看是什么效果.

temp1 = pd.read_csv('./data/test1019/data1.txt')temp1

Out[5]:

id name 0 1 1 2 2 31 3 421
temp2 = pd.read_csv('./data/test1019/data2.txt',dtype={'id':np.str})temp2

Out[6]:

id label 0 001 1 002 2 031
merge_data2 = pd.merge(temp1, temp2, on='id',how='left')merge_data2

Out[7]:

id name label 0 1 alice 1 2 bruce 2 31 cook 3 421 daisy

​ 比较理想的结果是: python将两个文件中所有以0打头的字段都忽略掉, 这样标准一样, merge的结果还是一致的.

​ 不理想的结果, 就如merge_data2的结果, pythontemp1id字段中的0忽略掉, 但是temp2id字段中的0还是正常显示, 这样就会造成结果输出与预想的不一致, 导致后续所有的结果都是错的.

​ 那么问题来了, 像这种小量的数据, 我们能直接观察到数据读写的问题, 如今大数据时代, 我们该如何规避此类问题呢? 在上面的代码中, 已经给出了一种解决方案.

#方案1: 使用lambda函数temp3 = pd.read_csv('./data/test1019/data1.txt',converters={'id': lambda x: str(x)})temp3

Out[8]:

id name 0 001 1 002 2 031 3 421
#方案2: 使用dtype对特定列进行制定数据类型temp4 = pd.read_csv('./data/test1019/data2.txt',dtype={'id':np.str})temp4

Out[9]:

id label 0 001 1 002 2 031
merge_data3 = pd.merge(temp3, temp4, on='id',how='left')merge_data3

因此, 为了保证数据原有的格式, 对一些会被各种编程语言特殊处理掉的数据, 一定要先声明数据类型.

本文为博主原创文章,未经博主允许不得转载

如若转载, 请注明出处

原创粉丝点击