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

时间:2019-01-10 09:55:47

标签: python pandas

我有一个数据框(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 个答案:

答案 0 :(得分:2)

使用pd.Series.isnullnp.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

答案 1 :(得分:1)

正如您所说的,您已经知道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

答案 2 :(得分:0)

您是否需要像'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

我认为发生错误是因为您试图访问float的元素,例如使用列表。

示例:

my_float = 3.0 
my_float[0]

TypeError: 'float' object is not subscriptable