熊猫合并返回 NaN

Posted

技术标签:

【中文标题】熊猫合并返回 NaN【英文标题】:Pandas Merge returns NaN 【发布时间】:2018-03-27 00:50:38 【问题描述】:

我在合并两个大型 Dataframe 时遇到问题,因为尽管有合适的值,但合并会返回 NaN 值。两个df的形状如下:

df1

Motor
2232
1524
2230
2230
2224
1516
1724
2224
1524
1624
1724
2224
2224
1524
1524
1516
1524
2224
1624
1724
1724
2224
2224

df2

Motor   Output Torque (mNm)
0615    0,17
1219    0,72
1516    0,59
1624    2
2230    4,7
2233    5,9
0816    0,7
1016    0,92
1024    1,6
1224    1,7
1319    1,4
1331    3,8
1516    0,97
1524    2,9
1717    2,2
1724    4,5
2224    6,8
2232    10
1336    3,6
1727    4,9
1741    8,8
2237    12
2642    26

我使用代码:

MergeDat=MergeDat.merge(Motor,how="left")
print(MergeDat)

其中 MergeDat= df1 和电机= df2

结果返回:

  Motor  Output Torque (mNm)
0      2232                  NaN
1      1524                  NaN
2      2230                  NaN
3      2230                  NaN
4      2224                  NaN
5      1516                  NaN
6      1724                  NaN
7      2224                  NaN
8      1524                  NaN
9      1624                  NaN
10     1724                  NaN
11     2224                  NaN
12     2224                  NaN
13     1524                  NaN
14     1524                  NaN
15     1516                  NaN
16     1524                  NaN
17     2224                  NaN
18     1624                  NaN
19     1724                  NaN
20     1724                  NaN
21     2224                  NaN
22     2224                  NaN
23     1524                  NaN
24     1724                  NaN
25     1841                  NaN
26     2224                  NaN

我不知道为什么没有合并输出扭矩列...

感谢任何帮助!

【问题讨论】:

您可以在问题中添加df.dtypes 吗?怀疑后面是字符串列,前面是数字类型。 “电机”列的数据类型不同。通过应用jezrael 的答案解决了这个问题 【参考方案1】:

您需要相同的 dtype 连接列:

#convert first or second to str or int
MergeDat['Motor'] = MergeDat['Motor'].astype(str)
#Motor['Motor'] = Motor['Motor'].astype(str)

#MergeDat['Motor'] = MergeDat['Motor'].astype(int)
Motor['Motor'] = Motor['Motor'].astype(int)

#convert first or second to str or int
#MergeDat['Motor'] = MergeDat['Motor'].astype(str)
Motor['Motor'] = Motor['Motor'].astype(str)

MergeDat['Motor'] = MergeDat['Motor'].astype(int)
#Motor['Motor'] = Motor['Motor'].astype(int)


MergeDat=MergeDat.merge(Motor,how="left")

【讨论】:

如果 pandas 在 dtype 不同时会打印警告,那就太好了。 @Sören - 是的,也许在熊猫的未来版本中。顺便说一句,合并的最后一个改进是this,但仍然没有检查相同的 dtypes :( 我想补充一点,我在尝试将 object 类型的列合并在一起时遇到了问题。我必须将它们设置为str,以便它们的加入工作。 在 pandas 0.25.1 中,我遇到了这个确切的问题,但两列上的 .astype(str)object 包含 DOI)没有任何改变。 @KatrinLeinweber - 嗯,对象表示字符串,所以尝试转换为数字 - link【参考方案2】:

在我的情况下,这是因为我在拆分数据框后没有重置索引,使用df.reset_index(drop=True)。重置第一个数据帧的索引可以将第二个数据帧合并到它。

【讨论】:

非常感谢。这是唯一对我有用的东西。为什么需要重置索引?【参考方案3】:

根据我的经验,在关键列中有一些 NaN 是常见的罪魁祸首。在df 上至少尝试这 3 行中的第 2 行(其中 unique_id 是用于合并的键列),看看它是否有帮助:

print(df[unique_id].duplicated().sum())
df.drop_duplicates(subset=unique_id, inplace=True)
assert(df[unique_id].duplicated().sum() == 0)

【讨论】:

以上是关于熊猫合并返回 NaN的主要内容,如果未能解决你的问题,请参考以下文章

如何合并/组合熊猫中的列?

如何在熊猫中合并两个数据框以替换 nan

熊猫合并101

熊猫合并101

熊猫合并101

熊猫内部合并/加入返回所有行