首页 > 解决方案 > Pandas 在其他列中合并 NaN

问题描述

我有两个数据框,希望将它们合并为两列并保留其余列。有时,Pandas 只是将之前包含数据的所有其他列排除在外。那是我不习惯使用 SQL 的东西。我是否使用了错误的合并命令?

数据类型和列名是:pdBewertungen

[[id]]                               int64
Matrikelnummer                     float64
Nachname                            object
Vorname                             object
Institution                         object
Übungsblätter gesamt (Punkte)       object
Blatt1                              object
Blatt2                              object
Blatt3                              object
Blatt4                              object
Blatt5                              object
Zuletzt aus diesem Kurs geladen      int64
dtype: object

和 pdGruppenBachelor

Vorname            object
Nachname           object
Matrikelnummer     object
Mailadresse        object
Gruppe             object
Gruppenwahl       float64
dtype: object

我想加入[Vorname,Nachname]这对(对不起,这些名字是德国人)。

结果给了我一个数据框,其中 Blatt1,Blatt2,...都是 NaN,即使它们之前是整数。结果列的数量是正确的。

命令是:

dfBA = pd.merge(pdGruppenBachelor, pdBewertungen,  how='left', on=['Vorname','Nachname'])

抱歉,我不能给出示例代码,因为它背后的 CSV 是学生数据。

有什么我做错了吗?

标签: python-3.xpandasmerge

解决方案


首先,从您的问题中不清楚每个表的名称是什么,我们可以假设包含 blats 的表是正确的,如果连接是左的

在我看来,有几件事需要检查,首先,根据您的示例进行内部连接:

dfBA = pd.merge(pdGruppenBachelor, pdBewertungen,  how='inner', on=['Vorname','Nachname'])

在这种情况下,不会出现 NULL,即使行数会减少。如果是这种情况,则仅意味着表之间没有太多(或很少)匹配项... table1 持有人 ['a','b','c'] 而 table2 持有 ['a', 'c','d'] 例如

另一项检查是为每个表中的键查找 NULL:

pdGruppenBachelor[['Vorname','Nachname']].isna().sum()
pdBewertungen[['Vorname','Nachname']].isna().sum()

每个 NULL 情况,甚至部分(仅缺少 Vorname)都会影响 JOIN 我要检查的最后一件事是名称中是否没有任何空格或大写/小写:“John Smith”与“joHn sMith”

所以一个可能的解决方案应该看起来像

pdGruppenBachelor['Vorname'] = pdGruppenBachelor['Vorname'].str.lower().strip()
pdBewertungen['Vorname'] = pdBewertungen['Vorname'].str.lower().strip()

pdGruppenBachelor['Nachname'] = pdGruppenBachelor['Nachname'].str.lower().strip()
pdBewertungen['Nachname'] = pdBewertungen['Nachname'].str.lower().strip()

然后尝试加入


推荐阅读