python 使用pandas.DataFrame.merge合并dataframe结果为空问题解决

问题描述

使用python2pandas合并两个datafreme时,结果为空。实际上两个表格有相同的数据,但是结果并没有合并。
官网:pandas.merge
在这里插入图片描述

使用代码

测试1:

两个数据表格,默认pandas读取数据格式pands.dtypes有差异,合并时无数据。

import pandas
df1 = pandas.read_csv("data1.txt", sep='\t')
df2 = pandas.read_csv("data2.txt", sep='\t')
pandas.merge(df1, df2, on=['name', 'value1', 'value2'])
df1.merge(df2, on=['name', 'value1', 'value2'])

在这里插入图片描述

测试2:

两个数据表格,默认pandas读取数据格式pands.dtypes相同,合并时有数据。

df1 = pandas.read_csv("data1a.txt", sep='\t')
df2 = pandas.read_csv("data2a.txt", sep='\t')
df1.dtypes
df2.dtypes
df1
df2
pandas.merge(df1, df2, on=['name', 'value1', 'value2'])
df1.merge(df2, on=['name', 'value1', 'value2'])

在这里插入图片描述

测试3:

发现相同的数据类型合并没有问题,所以变更一下数据类型为object,两个数据统一后再合并。但是合并的数据仍是空。
在这里插入图片描述

测试4:

统一数据类型,把对应的数据类型改为str,不能是object,结果合并没有问题。
(思考:为什么str对应的object?)
在这里插入图片描述

总结

使用pandas合并数据前需要确认,合并依赖的key(on/left_on/right_on等)的数据类型是否一致,如果不一致,则需要使用dataframe.astype将对应的列数据的类型进行转换。

注意:dataframe.astype只是返回转换后的数据,不替换原来的数据。

其他发现:
测试1的数据中,发现合并过程中不会考虑去重。就是说:当有相同的索引(on),如果两个数据中都有重复,最终合并时,也会重复, 就是有4*4次。


<完>

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用 `pd.merge()` 合并数据时,合并后的 DataFrame 的数据类型改变可能有以下几种原因: 1. 合并的列数据类型不一致,导致合并后的列数据类型发生了变化。 2. 合并的列存在缺失值,导致合并后的列数据类型发生了变化。 解决这个问题的方法有以下几种: 1. 在合并之前,将要合并的列的数据类型统一进行转换,确保合并的列数据类型一致。可以使用 `astype()` 方法将列的数据类型转换为指定类型: ```python df1['column'] = df1['column'].astype('int64') df2['column'] = df2['column'].astype('int64') ``` 2. 在合并时,通过指定 `dtype` 参数来强制指定合并后的列的数据类型。例如: ```python result = pd.merge(df1, df2, on='key', how='left', suffixes=('_left', '_right'), dtype={'value1': int, 'value2': float}) ``` 在上面的代码中,我们通过指定 `dtype` 参数,将 `value1` 列的数据类型设置为 `int`,将 `value2` 列的数据类型设置为 `float`,这样就可以保证合并后的列的数据类型不会发生变化。 3. 如果合并后的列存在缺失值,可以考虑填充缺失值或者删除缺失值。填充缺失值可以使用 `fillna()` 方法,删除缺失值可以使用 `dropna()` 方法。例如: ```python result = pd.merge(df1, df2, on='key', how='left', suffixes=('_left', '_right')).fillna(0) ``` 在上面的代码中,我们使用 `fillna()` 方法将合并后的 DataFrame 中的缺失值填充为 0,这样就可以避免因为缺失值导致的数据类型变化问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值