熊猫合并给KeyError

时间:2018-10-26 04:27:48

标签: python-3.x pandas dataframe data-science

我有2个数据框df_generaldf_award,它们共享一个称为ProjectNumber的列。我要合并它们。

我尝试使用dropna()删除所有行,但确实删除了它们-

df_award['ProjectNumber'].replace(' ', np.nan, inplace=True)
df_award.dropna(subset=['ProjectNumber'], inplace=True)
df_award.head()

然后像这样合并2个数据框(因为我只希望第一个表中的一列和第二个表中的2列)-

intersect = df_general[['Agency']].merge(df_award[['ProjectNumber', 'awarded_to']], on='ProjectNumber', how='left')

但是我仍然收到KeyError-

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2441             try:
-> 2442                 return self._engine.get_loc(key)
   2443             except KeyError:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'ProjectNumber'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)

请帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

您的merge语句中的左侧数据框为df_general[['Agency']]。这意味着它将是一个单列数据帧(仅包含列Agency),但是您正在尝试将其合并到列ProjectNumber中。因此,我认为您也希望包括该列,以便该列在两个框架中都存在:

intersect = df_general[['ProjectNumber','Agency']].merge(df_award[['ProjectNumber', 'awarded_to']], on='ProjectNumber', how='left')

答案 1 :(得分:1)

看来您几乎一切都正确。密钥必须同时在左侧和右侧。看来您没有在ProjectNumber数据帧上传递df_general。也许以下方法会更好:

df_general[['Agency', 'ProjectNumber']].merge(df_award[['ProjectNumber', 'awarded_to']], on='ProjectNumber', how='left')

然后,您只需将重复的键列放在intersect数据框中。

或者,如果键列的名称不同,则应指定left_on=right_on=,同时确保左右数据帧均包含键。