开发者问题收集

迭代数据框列:TypeError:'float'对象不可下标

2019-01-10
5804

我有一个数据框 ( 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 的值。

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

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

但是我收到错误:

TypeError: 'float' object is not subscriptable

我该怎么做需要做什么来修复?

3个回答

使用 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
jpp
2019-01-10

正如您所说的那样,您已经确定了最大值,可以尝试此矢量化解决方案:

585088123

输出:

3222248359
anky
2019-01-10

您是否需要像“P4”和“P5”这样的值?我试图重现与您的类似的 DataFrame,但没有这些值,它就可以正常工作:

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
adan
2019-01-10