如何将 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:]
我的具体问题是,是否有人能认识到为什么当我 运行 下面的这段代码时,我会收到这个特定的错误。或者更好的是,如何修复它。我正在尝试将 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:]