仅在函数中使用合并时才出现熊猫键错误

Posted

技术标签:

【中文标题】仅在函数中使用合并时才出现熊猫键错误【英文标题】:pandas key error only when using merge only in a function 【发布时间】:2021-04-17 22:57:43 【问题描述】:

我有两个数据框“base_level”和“raw_inventory”,包含以下列:

“base_level”列 -> “a”、“b”、“c”、“inventory_id”...

“raw_inventory”列 -> “1”、“2”、“3”、“inventoryparentid”、.....

当我如下所示直接使用合并连接时,一切都按预期工作。

level = pd.merge(base_level, raw_inventory, left_on='inventory_id', right_on='inventoryparentid', how='left')

打印(级别)

但是当我在函数中使用它并尝试如下所示调用时

def inv_level ( child_inv, parent_inv, lefton, righton, how ):
      level_inv = pd.merge(parent_inv, child_inv, left_on=lefton, right_on=righton, how=how)
      return level_inv


level = inv_level(base_level, raw_inv, 'inventory_id', 'inventoryparentid', 'left')
print(level)

它会抛出以下错误


  File "C:\temp\env\3.8.6\lib\site-packages\pandas\core\reshape\merge.py", line 652, in __init__
    ) = self._get_merge_keys()
  File "C:\temp\env\3.8.6\lib\site-packages\pandas\core\reshape\merge.py", line 1005, in _get_merge_keys
    right_keys.append(right._get_label_or_level_values(rk))
  File "C:\temp\env\3.8.6\lib\site-packages\pandas\core\generic.py", line 1563, in _get_label_or_level_values
    raise KeyError(key)
KeyError: 'inventoryparentid'

我无法确定可能是什么原因。感谢您提供有关此问题的任何意见。

编辑:

我尝试使用以下示例代码来展示我正在尝试做的事情并且易于理解。我得到同样的错误。

import numpy as np
import pandas as pd


def inv_level ( child_inv, parent_inv, lefton, righton, how ):
    level_inv = pd.merge(parent_inv, child_inv, left_on=lefton, right_on=righton, how=how)
    return level_inv


def main(event, context):
    np.random.seed(0)
    # transactions
    left = pd.DataFrame('transaction_id': ['A', 'B', 'C', 'D'], 
                        'user_id': ['Peter', 'John', 'John', 'Anna'],
                        'value': np.random.randn(4),
                    )
    # users
    right = pd.DataFrame('new_id': ['Paul', 'Mary', 'John', 'Anna'],
                        'favorite_color': ['blue', 'blue', 'red', 
                                            np.NaN],
                        )

'''
    test = inv_level(left, right, 'user_id', 'new_id', 'left') #left.merge(right, on='user_id', how='left')
     The above throws an error
'''
    test = pd.merge(left, right, left_on='user_id', right_on='new_id', how='left') 

    print(test)

if __name__ == "__main__":
    main("", "")

错误:

文件“C:\temp\env\3.8.6\lib\site-packages\pandas\core\reshape\merge.py”,第 1005 行,在 _get_merge_keys right_keys.append(right._get_label_or_level_values(rk)) _get_label_or_level_values 中的文件“C:\temp\env\3.8.6\lib\site-packages\pandas\core\generic.py”,第 1563 行 引发 KeyError(键) KeyError: 'new_id'

这是预期的输出:

  transaction_id user_id     value new_id favorite_color
0              A   Peter  1.764052    NaN            NaN
1              B    John  0.400157   John            red
2              C    John  0.978738   John            red
3              D    Anna  2.240893   Anna            NaN

谢谢,

【问题讨论】:

检查数据框上的“inventoryparentid”列。 @L.Papadopoulos 感谢您的回复。我确实检查了该列并且它存在。我添加了带有示例数据的小 python 脚本,它有同样的错误。可能有助于理解问题。 你能把想要的输出放上去吗?测试数据框? 【参考方案1】:

试试这个:

test = inv_level(left, right, left['user_id'], right['new_id'], 'left')

【讨论】:

感谢您的回复。我试过了,它不是预期的输出。这就是我得到的。 key_0 new_id favorite_color transaction_id user_id value 0 Peter Paul blue NaN NaN NaN 1 John Mary blue C John 0.978738 2 John John red C John 0.978738 3 Anna Anna NaN D Anna 2.240893

以上是关于仅在函数中使用合并时才出现熊猫键错误的主要内容,如果未能解决你的问题,请参考以下文章

异步/等待仅在读取文件时才是有效的异步函数[重复]

只有在 Visual Studio 之外运行 EXE 时才会出现发布错误

仅在验证成功时渲染组件

日期选择器仅在聚焦时显示错误

为啥我会收到错误“不安全代码可能仅在使用 /unsafe 编译时出现”?

使用 MapBox loadImage 函数时,仅在 Chrome 中出现 AWS S3 CORS 错误