我已经用Pandas读取了一个Excel工作表,该工作表有两列用于创建键,值字典。运行后,代码将搜索一个键,并产生它的值。例如:WSO-Exchange等于52206。
尽管,当我搜索59904-FX的值时,当我需要它返回22035时,它返回35444;仅当以后的键也是一个值时,它才会引发此问题。关于如何解决此错误的任何想法?我将在下面附加我的代码,谢谢!
MapDatabase = {}
for i in Mapdf.index:
MapDatabase[Mapdf['General Code'][i]] = Mapdf['Upload Code'][i]
df [“ AccountID”] [i]正在读取另一个Excel工作表,以搜索该单元格是否在字典的键中,如果是,则将其更改为其值。 >
for i in df.index:
for key, value in MapDatabase.items():
if str(df['AccountId'][i]) == str(key):
df['AccountId'][i] = value
答案 0 :(得分:0)
我只会使用xlrd库来做到这一点:
from xlrd import open_workbook
workbook = open_workbook("data.xlsx")
sheet = workbook.sheet_by_index(0)
data = {sheet.cell(row, 0).value: sheet.cell(row, 1).value for row in range(sheet.nrows)}
print(data)
哪个给出以下字典:
{'General Code': 'Upload Code', '59904-FX': 22035.0, 'WSO-Exchange': 52206.0, 56476.0: 99875.0, 22035.0: 35444.0}
答案 1 :(得分:0)
最有可能的问题是,您正在遍历DataFrame Mapdf
的非唯一索引。检查用于构建Mapdf
的Excel文件中的第一列是否每行唯一。
但是,您可以尝试通过调用dict constructor来构建字典,而不是尝试在DataFrame上逐行进行迭代(这几乎总是错误的做法),而将字典传递给(键,值)对:
MapDatabase = dict(zip(Mapdf["General Code"], Mapdf["Upload Code"]))
更好的是,您的工作似乎是DataFrame.merge
的理想人选。
如果AccountId
在{中有一个匹配项,您似乎想用df
中的Upload Code
值覆盖Mapdf
中的AccountId
值General Code
中的{1}}。那是一口,但让我们分解一下。
首先,通过匹配的列(Mapdf
至Mapdf
)将df
合并到df["AccountId"]
上:
Mapdf["General Code"]
由于这是left join,因此columns = ["General Code", "Upload Code"] # only because it looks like there are more columns you don't care about
merged = df.merge(Mapdf[columns], how="left", left_on = "AccountId", right_on="General Code")
中merged
列与AccountId
不匹配的行将缺少Mapdf["General Code"]
的值。复制非缺失值以覆盖Upload Code
:
AccountId
然后根据需要删除多余的列:
matched = merged["Upload Code"].notnull()
merged.loc[matched, "AccountId"] = merged.loc[matched, "Upload Code"]
答案 2 :(得分:0)
编辑:原来我不需要做一个嵌套的for循环。解决方案是从for循环转到if语句。
for i in df.index:
if str(df['AccountId'][i]) in str(MapDatabase.items()):
df.at[i, 'AccountId'] = MapDatabase[df['AccountId'][i]]