代码之家  ›  专栏  ›  技术社区  ›  Stacey

迭代数据帧列:TypeError:“float”对象不可下标

  •  1
  • Stacey  · 技术社区  · 6 年前

    我有一个数据框( df )有一个叫做 Id 看起来像

            Id
     0       3
     1      67
     2     356
     3      
     :
    50      P4
    51      P5
    52     678
    53 
    54       2
    

    该列具有以下类型: dtype: object 我已经计算出了最大Id值,并分配给一个名为maxId的变量(它是678,我希望对空元素应用一个顺序递增的maxId,因此在本例中,我的输出是:

            Id
     0       3
     1      67
     2     356
     3     679
     :
    50      P4
    51      P5
    52     678
    53     680
    54       2
    

    其中,元素3和53的赋值分别为679和680。

    我尝试了以下代码,其中我在列中循环查找null元素,然后将maxId应用于这些元素:

    for item, frame in df['Id'].iteritems():
            if pd.isnull(frame):
                maxId = maxId + 1
                frame['Id'] = maxId 
    

    但我有一个错误:

    TypeError:“float”对象不可下标

    3 回复  |  直到 4 年前
        1
  •  2
  •   jpp    6 年前

    使用 pd.Series.isnull np.arange :

    # calculate maximum value
    maxId = int(pd.to_numeric(df['Id'], errors='coerce').max())
    
    # calculate Boolean series of nulls
    nulls = df['Id'].isnull()
    
    # assign range starting from one above maxId
    df.loc[nulls, 'Id'] = np.arange(maxId + 1, maxId + 1 + nulls.sum())
    
    print(df)
    
    #      Id
    # 0     3
    # 1    67
    # 2   356
    # 3   679
    # 50   P4
    # 51   P5
    # 52  678
    # 53  680
    # 54    2
    
        2
  •  1
  •   anky    6 年前

    正如您所说,您已经计算出maxId,您可以尝试此矢量化解决方案:

    >>df
    
        Id
    0   3
    1   67
    2   356
    3   NaN
    5   P4
    6   P5
    7   678
    8   NaN
    9   2
    
    n = 678
    n=n+1
    df.loc[df.Id.isnull(), 'Id'] = list(np.arange(n,n+len(df.Id[df.Id.isna()].values)))
    >>df
    

    输出:

        Id
    0   3
    1   67
    2   356
    3   679
    5   P4
    6   P5
    7   678
    8   680
    9   2
    
        3
  •  0
  •   adan    6 年前

    您需要像“P4”和“P5”这样的值吗?我试图复制与您的数据帧相似的数据帧,但没有这些值,它只能工作:

    df = pd.DataFrame({'A' : [20,4, np.nan, np.nan, 12, np.nan, 6, 10]})
    
    maxID = df['A'].max()
    
    for i in range (len(df['A'])):
        if pd.isnull(df['A'].loc[i]):
            maxID +=1
            df['A'].loc[i] = maxID
    

    我认为您的错误是因为您试图访问浮点的一个元素,就像您使用列表所做的那样。

    例如:

    my_float = 3.0 
    my_float[0]
    
    TypeError: 'float' object is not subscriptable