熊猫索引 - 奇怪的错误

时间:2015-10-23 19:13:43

标签: python pandas dataframe

我有一个奇怪的索引问题。

我有一个数据框“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__'

我无法弄清楚为什么我会收到这个奇怪的错误。

请帮忙!

谢谢!

2 个答案:

答案 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似乎不喜欢我试图在空值上运行操作。