【问题标题】:pd.merge. error: ValueError: Wrong numberpd.merge。错误:ValueError:错误的号码
【发布时间】:2023-03-30 20:43:02
【问题描述】:

在“供应商”df 中,我正在尝试创建一个名为“Non-PO 类别”的列,该列将根据“唯一”列中的值具有来自 df“类别”的“类别”。

这里是 dfs:

import pandas as pd

suppliers = pd.DataFrame({'Vendor Number': ['260508', '260525', '260549', '260561','260579','260587'],
                    'Unique': ['26050822015070', '26052522002153', '260549EXPENSE', '260561EXPENSE','2605792972508701C0000','26058738210793']})
categories = pd.DataFrame({'Vendor Number': ['260508', '260525', '260549','260587'],
                    'Unique': ['26050822015070', '26052522002153', '260549EXPENSE','26058738210793'],
                    'Category': ['Maintenance', 'IT','Facilities','Travel Agent']})

当我使用时:

suppliers['Non-PO Category'] = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

suppliers['Non-PO Category'] = pd.merge(suppliers, categories, how='left', left_on='Unique', right_on='Unique')

我收到错误:ValueError: 传递的项目数量错误 4,位置意味着 1

提前谢谢你。

【问题讨论】:

  • 为什么要使用 NonPO_Suppliers[['Unique','Category']]?改用:pd.merge(final, NonPO_Suppliers, how=left, left_on=key_of_left_table, right_on=key_on_right_table)
  • @Trics。谢谢你。我进行了更改,但收到错误消息:“错误的项目数超过了 17,位置意味着 1”?
  • @Andrian,如果你能提供你的数据框样本,我会尽力为你提供你所需要的。
  • @sophods 谢谢。我已经用 dfs 和简化的问题陈述更新了我的问题。
  • @Andrian 感谢您这样做。请检查下面的更新答案。我认为这就是你所需要的。告诉我。

标签: python pandas


【解决方案1】:

您收到错误的原因是您尝试使用pd.merge 创建一个新列,而默认情况下pd.merge 返回一个合并对象的数据框。你的代码:

suppliers['Non-PO Category'] = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

因此,如果您更改代码并打算返回一个数据框,如下所示:

new_suppliers = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

你会得到你想要的输出:

new_suppliers
Out[8]: 
  Vendor Number                 Unique      Category
0        260508         26050822015070   Maintenance
1        260525         26052522002153            IT
2        260549          260549EXPENSE    Facilities
3        260561          260561EXPENSE           NaN
4        260579  2605792972508701C0000           NaN
5        260587         26058738210793  Travel Agent

我希望这能回答你的问题。

请注意,这会创建一个新的数据框。如果你不想这样,你可以简单地覆盖你以前的:

suppliers = pd.merge(suppliers, categories[['Unique','Category']], on='Unique', how='left')

【讨论】:

  • 您能提供您的 2 个数据帧的样本以便我进行复制吗?请以字典的形式进行,以便我可以快速重新创建。
  • 非常感谢!它适用于字典,但是当我使用代码在“供应商”文件(通常不存在)上生成“唯一”列时,代码为:suppliers['Unique']=suppliers['Vendor Number'].astype(str) + supplier['Vendor Site Code'].astype(str) - 然后按照您的指示执行合并,我得到“类型错误:字符串索引必须是整数”。是不是因为“唯一”是字母数字的,例如“260561EXPENSE”,知道如何避免这个错误吗?我知道这超出了我原来的问题。我应该将其作为一个新问题发布并将其标记为已解决吗?谢谢!
  • 是的,我认为这是一个很好的观点。将此标记为已解决并发布一个新的。我也会尝试解决新的问题。请在您这样做时告诉我,以便我收到通知。
  • 你能接受并关闭这个问题吗?另外,你可以问新的。
  • 抱歉迟到了。我不得不重新编写我的代码并在我的新问题中找到链接文件。我接受答案,请参阅我的新问题的链接。非常感谢! stackoverflow.com/questions/65346930/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2015-03-29
相关资源
最近更新 更多