pd.merge "TypeError: 字符串索引必须是整数"

Posted

技术标签:

【中文标题】pd.merge "TypeError: 字符串索引必须是整数"【英文标题】:pd.merge "TypeError: string indices must be integers" 【发布时间】:2021-03-28 12:15:51 【问题描述】:

我有 3 个文件,我的代码基本上是一系列合并,将文件 "lookup""NonPO" 中的数据填充到文件 "supplier" 中,并创建一个名为 "final2" 的新 df。代码运行得非常好,并在最后一次合并之前产生我期望的输出。

当基于"supplier"(供应商编号+供应商站点代码)上名为"Unique" 的新列与文件"NonPO" 中的同名列完成最后一次合并时,会出现此问题。此合并的唯一不同之处在于它基于通过串联创建的列(之前的合并使用了文件中已经存在的列)。串联连接可能包含字母和/或数字的列,例如"260549" + "EXPENSE" = "260549EXPENSE".

我得到的错误是:

    runfile('//eu.ad.hertz.com/userdocs/irac920/Desktop/My Files/Python/Supplier cat testing/file.py', wdir='//eu.ad.hertz.com/userdocs/irac920/Desktop/My Files/Python/Supplier cat testing')
Traceback (most recent call last):

  File "\\eu.ad.hertz.com\userdocs\irac920\Desktop\My Files\Python\Supplier cat testing\file.py", line 33, in <module>
    final2 = pd.merge(final2, NonPO[['Unique','Category']], on='Unique', how='left')

TypeError: string indices must be integers

我的文件:

    "supplier" - (File link) "lookup" - (File link) "NonPO" - (File link)

对于解决此问题的任何帮助将不胜感激。谢谢!

我的代码:

import pandas as pd
import numpy as np
pd.set_option('display.expand_frame_repr', False)


supplier = r'//eu.ad.hertz.com/userdocs/irac920/Desktop/My Files/Python/Supplier cat testing/Suppliers.xlsx'
lookup = r'//eu.ad.hertz.com/userdocs/irac920/Desktop/My Files/Python/Supplier cat testing/Lookup.xlsx'
NonPO = r'//eu.ad.hertz.com/userdocs/irac920/Desktop/My Files/Python/Supplier cat testing/Non-PO Suppliers.xlsx'

sr = pd.read_excel(supplier)
lp_type = pd.read_excel(lookup, sheet_name=0)
lp_paygroup = pd.read_excel(lookup, sheet_name=1)
NonPO_Suppliers = pd.read_excel(NonPO)

results_type = pd.merge(sr, lp_type[['Type','L1']], on='Type', how='left')
results_type.sort_values(by='Supplier', inplace=True)

results_paygroup = pd.merge(results_type, lp_paygroup[['Paygroup','L2']], on='Paygroup', how='left')
results_paygroup.sort_values(by='Supplier', inplace=True)

type_from_paygroup = results_paygroup.copy()
type_from_paygroup['L1'] = results_paygroup.merge(lp_paygroup, on='Paygroup', how='left').apply(lambda r: r.L1_x if (r.L1_y is np.nan or r.L2_y == 'Vendor Level') else r.L1_y, axis=1)
type_from_paygroup.sort_values(by='Supplier', inplace=True)

paygroup_from_type = type_from_paygroup.copy()
paygroup_from_type['L2'] = type_from_paygroup.merge(lp_type, on='Type', how='left').apply(lambda r: r.L2_x if (r.L2_y is np.nan or r.L2_y == 'Vendor Level') else r.L2_y, axis=1)
paygroup_from_type.sort_values(by='Supplier', inplace=True)
final = paygroup_from_type.replace(np.nan,'Missing')


final['Unique']=final['Vendor Number'].astype(str) + final['Vendor Site Code'].astype(str)
final2 = final.copy()
final2 = pd.merge(final2, NonPO[['Unique','Category']], on='Unique', how='left')
print(final2)

【问题讨论】:

请在您的问题文本中包含您输入数据的样本,而不是作为外部链接或图像,以制作minimal reproducible example @G。安德森 谢谢。我的问题是,当我以字典的形式使用 dfs 重新编写代码时(这是我的初衷),问题根本没有发生。只有在出现问题时才采用这种形式(使用 Excel 文件)。链接的文件只是一个示例(每行几行)。如果这是一个问题,我想避免链接外部文件,但我没有看到解决这个问题的方法。我希望它有意义?谢谢。 @MattDMo 谢谢。我已经编辑了我的问题并添加了完整的错误消息。 【参考方案1】:

您正在尝试访问NonPO 作为您的数据框,但实际上这是包含该文件名的变量,它是一个字符串。这里很清楚

NonPO_Suppliers = pd.read_excel(NonPO)

只需将NonPO 更改为NonPO_Suppliers 就可以了。

final2 = pd.merge(final2, NonPO_Suppliers[['Unique','Category']], on='Unique', how='left')

【讨论】:

非常感谢。我想我只是假设问题是由于我连接字符串数字而错过了明显的错误。太棒了! 它一直在发生,别担心!【参考方案2】:

考虑一下:

NonPO = r'//eu.ad.hertz.com/userdocs/irac920/Desktop/My Files/Python/Supplier cat testing/Non-PO Suppliers.xlsx'
NonPO_Suppliers = pd.read_excel(NonPO) # this is the name of the DataFrame, not NonPO.

因此,您需要将代码更改为:

final2 = pd.merge(final2, NonPO[['Unique','Category']], on='Unique', how='left')
final2 = pd.merge(final2, NonPO_Suppliers[['Unique','Category']], on='Unique', how='left')

希望这会奏效。

【讨论】:

谢谢。它绝对解决了我的问题。我不能接受两个答案,不幸的是我已经接受了前一个!对不起。但我真的很感谢您调查此事并如此迅速地解决! 当然没问题!很高兴您的问题得到解决。如果您需要任何帮助,请告诉我,我会尽力提供帮助。

以上是关于pd.merge "TypeError: 字符串索引必须是整数"的主要内容,如果未能解决你的问题,请参考以下文章

pd.concat() 和 pd.merge() 之间的区别以及为啥我会得到错误的输出?

使用 pd.merge() 合并两个以上的数据帧

pandas-16 pd.merge()的用法

Python pd.merge函数通过索引横向合并csv文件

pd.merge :尝试合并具有相同列名的数据框

pd.concat()与pd.merge()之间的区别,为什么我得到错误的输出?