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

     2023-03-27     108

关键词:

【中文标题】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() 合并两个以上的数据帧

】使用pd.merge()合并两个以上的数据帧【英文标题】:MergingMORETHANtwodataframeswithpd.merge()【发布时间】:2021-01-0620:10:51【问题描述】:我正在尝试基于特定列(“文件名”)使用pd.merge()合并4个csv文件。我读到合并仅适用于两个数据... 查看详情

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

】pd.merge:尝试合并具有相同列名的数据框【英文标题】:pd.merge:tryingtomergeDataframeswithsamecolumnsnames【发布时间】:2020-04-1301:44:41【问题描述】:我知道这是一个简单的问题,但我被困了很长一段时间。我有两个DataFrame,它们有一... 查看详情

详解pandas库的pd.merge函数(代码片段)

pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'),copy=Tr 查看详情

python详解pandas库的pd.merge函数(代码片段)

本篇详细说明merge的应用,join和concatenate的拼接方法的与之相似。pd.merge(left,right,how=‘inner‘,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=(‘_x‘,‘_y‘),copy=True,indicator=False 查看详情

pd.merge 给出错误:DataFrame' 对象是可变的,因此它们不能被散列

】pd.merge给出错误:DataFrame\\\'对象是可变的,因此它们不能被散列【英文标题】:pd.mergegiveserror:DataFrame\'objectsaremutable,thustheycannotbehashedpd.merge给出错误:DataFrame\'对象是可变的,因此它们不能被散列【发布时间】:2020-07-1411:17:07... 查看详情

10-pandas之数据融合(pd.merge()join()combine_first()详解)

一、pd.merge()二、join()三、combine_first() 查看详情

pd.merge操作的on参数解释

 #同时传入两个Key,此时会进行以[‘key1‘,‘key2‘]列表的形式进行对应,left的keys列表是:[[‘K0‘,‘K0‘],[‘K0‘,‘K1‘],[‘K1‘,‘K0‘],[‘K2‘,‘K1‘]],left的keys列表是:[[‘K0‘,‘K0‘],[‘K1‘,‘K0‘],[‘K1‘,‘K0‘],[‘K2‘... 查看详情

一次性彻底讲透python中pd.concat与pd.merge(代码片段)

数据的合并与关联是数据处理过程中经常遇到的问题,在SQL、HQL中大家可能都有用到join、uionall等,在Pandas中也有同样的功能,来满足数据处理需求,个人感觉Pandas处理数据还是非常方便,数据处理效率比较高... 查看详情

caog(代码片段)

...期‘]),index=kc.index,columns=[‘日期1‘,‘付款时刻‘])kc1=pd.merge(kc,bb,left_index=True,right_index=True)aa=pd.DataFrame((str(x).split(‘‘)forxindf[‘付款时间‘]),index=df.index,columns=[‘日期1‘,‘付款时刻‘])df=pd.merge(df,aa,left_index=True,right_index=True)df[... 查看详情

TypeError('"listener" 参数必须是函数');

】TypeError(\\\'"listener"参数必须是函数\\\');【英文标题】:TypeError(\'"listener"argumentmustbeafunction\');TypeError(\'"listener"参数必须是函数\');【发布时间】:2020-04-1618:15:34【问题描述】:我正在学习ShamaHoque的pdf课程-f... 查看详情

TypeError "styled": 符号不是函数

】TypeError"styled":符号不是函数【英文标题】:TypeError"styled":symbolisnotafunction【发布时间】:2021-02-2710:18:44【问题描述】:我正在运行npmtest并收到以下错误:FAILsrc/App.test.js●TestsuitefailedtorunTypeError:symbolisnotafunctionatSt... 查看详情

详解pandas库的pd.merge函数

pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'),copy=True,indicator=False,validate=None)参数如下:left:拼接的左侧DataFrame对象righ... 查看详情

python:"typeerror:'type'objectisnotsubscriptable"

目前stackoverflow找到两种情况的解决办法:1、TypeError:‘type‘objectisnotsubscriptablewhenindexingintoadictionaryIhavemultiplefilesthatIneedtoloadsoI‘musingadicttoshortenthings.WhenIrunIgeta"TypeError:‘type‘objectisno 查看详情

Python "TypeError: unhashable type: 'slice'" 用于编码分类数据

】Python"TypeError:unhashabletype:\\\'slice\\\'"用于编码分类数据【英文标题】:Python"TypeError:unhashabletype:\'slice\'"forencodingcategoricaldataPython"TypeError:unhashabletype:\'slice\'"用于编码分类数据【发布时间】:201 查看详情

未捕获的 TypeError - checkboxradio("refresh")

】未捕获的TypeError-checkboxradio("refresh")【英文标题】:UncaughtTypeError-checkboxradio("refresh")【发布时间】:2014-08-0722:32:16【问题描述】:我能想到的所有使用("#chkBox1").prop("checked",true).checkboxradio(&qu 查看详情

pythonpd.merge函数通过索引横向合并csv文件(代码片段)

1.pd.merge函数介绍pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y' 查看详情

使用pandas将两表进行关联查询merge()-横向合并

 1、首先获取两张表   2、内连接pd.merge(left=n,right=s,on="number")  how默认为”inner",内连接查询特点是有匹配的才显示,像A007和A011不匹配,所以不显示。     3、外连接pd.merge(left=n,right=s 查看详情

熊猫(Python)中的“反合并”

】熊猫(Python)中的“反合并”【英文标题】:"Anti-merge"inpandas(Python)【发布时间】:2016-11-0914:08:05【问题描述】:如何找出两个数据框中同名列之间的区别?我的意思是我有一个名为X的列的数据框A和一个名为X的列的数... 查看详情