如何将 int 对象变成可订阅的对象?

How do I make an int object into something that is subscriptable?

我的具体问题是,是否有人能认识到为什么当我 运行 下面的这段代码时,我会收到这个特定的错误。或者更好的是,如何修复它。我正在尝试将 df5 中部门编号的部门描述映射到第二个数据框的 (df2) TrueDepartment 列。 Df2 有一个名为 "Department" 的列,我想遍历它,搜索包含 4 或 5 个数字 dpt_nbrs 的子字符串。 Dpt_Nbr 在 df5 中从 1 到 10000 以上按升序排列,没有空白行。 df5 中的每个 Dept_Nbr 都有一个 Dept_Desc_HR,当在 df2 的 Department 列中找到子字符串(4 或 5 个连续数字)时,我想将此 Dept_Desc 写入 TrueDepartment 列df2。所以对于每个数据框(df2 有 2 列,df5 有 3 列)。 df2 有一个我想迭代的列 Deparment 和一个我想写入的列 TrueDepartment。 df5 有 3 列,Dept_Nbr、Dept_Desc_HR 和 Dept_Desc_AD。 df2 的 Department Column 有很多空白单元格和很多有值的单元格。其中一些值中没有数字,而另一些值中有多个数字,一些单元格包含数字、字母和特殊字符的组合。我想使用具有 4 或 5 个连续数字的单元格来识别 dept_nbr,然后将 Dept_Nbr 的 dept_desc 映射到 df2 的 TrueDepartment 列。如果Dept_Nbr在Dept_Desc_AD中有一个值,我想使用这个值并将它写入df2的TrueDepartment列。如果它在Dept_Desc_AD中没有值,我想将Dept_Desc_HD的内容写入df2的TrueDepartment列。我的代码适用于示例数据集,但在使用完整 excel 电子表格的更大数据集上,它会给我您在底部看到的错误。我感谢解决此问题的任何帮助。如果需要,我很乐意提供电子表格或任何其他信息。谢谢

import pandas as pd
import numpy as np
import re

#reading my two data frames from 2 excel files
excel_file='/Users/j0t0174/anaconda3/Depts_sheets_withonlyAD_4columns.xlsx'  
df2 = pd.read_excel(excel_file)

excel_file='/Users/j0t0174/anaconda3/dept_nbr.xlsx'
df5=pd.read_excel(excel_file)

df2=df2.replace(np.nan, "Empty",regex=True)
df5=df5.replace(np.nan, "Empty",regex=True)

numbers = df5['Dept_Nbr'].tolist()#-->adding dept_nbr's to list
df5['Dept_Nbr'] = [int(i) for i in df5['Dept_Nbr']]
df5 = df5.set_index('Dept_Nbr')  #<--setting data frame 5 (df5) to the new index

for n in numbers:
    for i in range(len(df5.index)):  #<--iterate through the number of elements not the elements themselves
        if str(n) == df2.loc[i, 'Department'][-4:]: #<-- convert n to str and slice df2 string for the last 4 chars
            if df5.loc[n, 'Dept_Desc_AD'] != "Empty":  #<--checking against a string, not a NaN
                df2.loc[i, 'TrueDepartment'] = df5.loc[n, 'Dept_Desc_AD']  #<-- use .loc not .at
            else:
                df2.loc[i, 'TrueDepartment'] = df5.loc[n, 'Dept_Desc_HD']


TypeError                                 Traceback (most recent call last)
<ipython-input-5-aa578c4c334c>     in <module>()
 17 for n in numbers:
 18     for i in range(len(df5.index)):  #<-- you want to iterate through the number of elements not the elements themselves 
---> 19         if str(n) == df2.loc[i, 'Department'][-4:]: #<-- convert n to str and slice df2 string for the last 4 chars
 20             if df5.loc[n, 'Dept_Desc_AD'] != "Empty":  #<-- you're actually checking against a string, not a NaN
 21                 df2.loc[i, 'TrueDepartment'] = df5.loc[n, 'Dept_Desc_AD']  #<-- use .loc not .at

TypeError: 'int' object is not subscriptable

你的错误是因为

df2.loc[i, 'Department']

returns 一个 int,这是不可订阅的。如果你想要这个整数的最后 4 位数字,请先将其设置为 str

str(df2.loc[i, 'Department'])

刚好可以下标

str(df2.loc[i, 'Department'])[-4:]