【问题标题】:KeyError(key) in merging a DF合并 DF 时的 KeyError(key)
【发布时间】:2021-06-04 09:13:35
【问题描述】:

我试图仅合并两个数据框的某些列。但是我的主题有错误。

import pandas as pd

planilha = pd.read_excel('campanha.xlsx', None)

pastas = list(planilha.keys())

campanha0 = pastas[0]

tabela = planilha['pluma_espuma_1'].merge(planilha['campanha_anexo3_mar_0'][['subprojet', 'Campanha', 'Pernada']], left_on='ParentGlobalID', right_on='GlobalID', how='left')
print(tabela.head())

但出现以下错误:

Traceback (most recent call last):
  File "D:\DADOS\Python\trabalhos\Logistica_rrdm\teste_excel_pd.py", line 19, in <module>
    tabela = planilha['pluma_espuma_1'].merge(planilha['campanha_anexo3_mar_0'][['subprojet', 'Campanha', 'Pernada']], left_on='ParentGlobalID', right_on='GlobalID', how='left')
  File "C:\Users\Aroldo\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\frame.py", line 8195, in merge
    return merge(
  File "C:\Users\Aroldo\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\reshape\merge.py", line 74, in merge
    op = _MergeOperation(
  File "C:\Users\Aroldo\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\reshape\merge.py", line 668, in __init__
    ) = self._get_merge_keys()
  File "C:\Users\Aroldo\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\reshape\merge.py", line 1033, in _get_merge_keys
    right_keys.append(right._get_label_or_level_values(rk))
  File "C:\Users\Aroldo\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\generic.py", line 1684, in _get_label_or_level_values
    raise KeyError(key)
KeyError: 'GlobalID'

关于我的数据,我从 excel 中获取数据,就像上面一样,但是构建一个数据框我的输入看起来完全像这样:

import pandas as pd
pluma_espuma_1 = pd.DataFrame({'ObjectID': [3, 4],
                   'GlobalID': ['a431fd6a-24f6-436e-a3b4-e7d8b44c80a3', 'b5ad25e8-9c99-40fd-b838-4127c6457f59'],
                    'Data': ['21/04/2021', '01/05/2021'],
                    'Estacao': [1500, 5500],
                    'ParentGlobalID': ['29aaebfa-67bb-4395-9d72-5aa19fcda267', 'e610b5e0-bf10-4239-90bb-3d2099e009e0']})

campanha_anexo3_mar_0 = pd.DataFrame({'ObjectID': [2, 3],
                    'GlobalID': ['29aaebfa-67bb-4395-9d72-5aa19fcda267', 'e610b5e0-bf10-4239-90bb-3d2099e009e0'],
                    'subproject': ['Marinho - Integrado', 'Dulcicola'],
                    'Campanha': [22, 23],
                    'Pernada': [1, 1],
                    'Creator': ['Ed_tty', 'Haruald']})

知道什么是正确的方法吗?谢谢!

data sample, picture

【问题讨论】:

  • 是的,您的合并语句看起来很奇怪。您要合并哪些列?如果您提供数据框(或数据框)的样本并显示您想要的输出,这将有助于澄清您的问题。有关详细信息,请参阅How to make good reproducible pandas examples。你可以edit你的帖子。
  • 您正在将相同的数据框合并在一起——本质上是planilha.merge(planilha)。您希望 df1.merge(df2) 具有正确的参数pandas.pydata.org/pandas-docs/stable/reference/api/…
  • 另外,在合并之前确保 ParentGlobalID 存在于您的左侧数据框中。通过使用planilha['pluma_espuma_1'].merge(),您首先要删除除pluma_espuma_1 之外的所有列,然后尝试在ParentGlobalID 上合并(不再在数据框中)。也许试试planilha[['ParentGlobalID', 'pluma_espuma_1']].merge(...)?
  • 否则,我肯定会阅读 @AlexK 引用的文章,以及 how to ask 上的 StackOverflow 指南。如果没有最小的可重现示例,我们很难诊断您的问题。尝试分解您的问题并在每个步骤检查代码,包括将您的错误行分解为多个步骤,以确保它按照您的想法进行。
  • 谢谢大家,花时间和指导......

标签: python python-3.x pandas


【解决方案1】:

您可以使用列名来获得所需的方式,但这会将两者合并

pluma_espuma_1.merge(campanha_anexo3_mar_0[['GlobalID', 'subproject', 'Campanha', 'Pernada']], left_on='ParentGlobalID', right_on='GlobalID', how='inner')


   ObjectID                            GlobalID_x        Data  Estacao                        ParentGlobalID                            GlobalID_y           subproject  Campanha  Pernada
0         3  a431fd6a-24f6-436e-a3b4-e7d8b44c80a3  21/04/2021     1500  29aaebfa-67bb-4395-9d72-5aa19fcda267  29aaebfa-67bb-4395-9d72-5aa19fcda267  Marinho - Integrado        22        1
1         4  b5ad25e8-9c99-40fd-b838-4127c6457f59  01/05/2021     5500  e610b5e0-bf10-4239-90bb-3d2099e009e0  e610b5e0-bf10-4239-90bb-3d2099e009e0            Dulcicola        23        1

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2020-12-23
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多