我有两个数据框,想将它们按两列合并并保留其余的列。有时,Pandas 只是将之前包含数据的所有其他列进行 NaN 运算。这是我从 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
和 pdGruppen学士
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 是学生数据。
我做错了什么吗?
答案 0 :(得分:2)
首先,从您的问题中不清楚每个表的名称是什么 我们可以假设包含 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()
然后尝试加入