我有一个奇怪的索引问题。
我有一个数据框“Full_Names_Copy”,其中一列的字符串值的末尾带有字母B或M,表示“十亿”或“百万”。
我正在通过列迭代1)检查字母的存在和2)如果字母存在,删除字母,转换为浮点数(在数十亿的情况下,乘以1000得到所有我的价值观是“数百万”)
我的数据框有一个完整填充的“符号”列,我用它来设置迭代的范围。
这是我的代码:
for i in range(0,len(Full_Names_Copy['Symbol'])):
letter = Full_Names_Copy.iloc[i,4][-1]
if letter == 'B':
test_int = float(Full_Names_Copy.iloc[i,4][0:len(Full_Names_Copy.iloc[i,4])-1])*1000
elif letter == 'M':
test_int = float(Full_Names_Copy.iloc[i,4[0:len(Full_Names_Copy.iloc[i,4])-1])
else:
### do some other stuff ###
这样:
len(Full_Names_Copy['Symbol'])
返回一个值。
letter = Full_Names_Copy.iloc[**row number entered here**,4][-1]
为所选行号
返回“B”或“M”然而,当我运行上面的完整代码时,我得到:
> TypeError Traceback (most recent call last)
<ipython-input-60-a45d46e088cb> in <module>()
1 for i in range(0,len(Full_Names_Copy['Symbol'])):
----> 2 letter = Full_Names_Copy.iloc[i,4][-1]
3 if letter == 'B':
4 test_int = float(Full_Names_Copy.iloc[i,4][0:len(Full_Names_Copy.iloc[i,4])-1])*1000
5 elif letter == 'M':
TypeError: 'NoneType' object has no attribute '__getitem__'
我无法弄清楚为什么我会收到这个奇怪的错误。
请帮忙!
谢谢!
答案 0 :(得分:1)
您确定None
列中没有Symbol
个值吗?
另一种方法是将转换逻辑放在一个函数中,并在列上应用此函数。
def convert(amt):
if not amt:
return 0.0 # Handle None and empty strings
num, sym = float(amt[:-1]), amt[-1]
if sym == 'M':
return num * 1e6
if sym == 'B':
return num * 1e9
raise ValueError('Invalid suffix')
然后,
Full_Names_Copy.Symbol.map(convert, na_action='ignore')
这将调用convert
中每个值的Symbol
函数,并返回包含返回值的列表。当然,您可以将其分配回Symbol
列。
Full_Names_Copy['Symbol'] = Full_Names_Copy.Symbol.map(convert, na_action='ignore')
答案 1 :(得分:0)
我发现了我的问题。我正在处理的列中有空值,Python似乎不喜欢我试图在空值上运行操作。