将Int64Index转换为Int

时间:2015-10-13 19:55:21

标签: pandas

我正在迭代数据框(称为hdf)并逐行应用更改。 hdf按group_id排序,并在某些标准上分配1到n的等级。

# Groupby function creates subset dataframes (a dataframe per distinct group_id).
grouped = hdf.groupby('group_id')

# Iterate through each subdataframe. 
for name, group in grouped:

    # This grabs the top index for each subdataframe
    index1 = group[group['group_rank']==1].index

    # If criteria1 == 0, flag all rows for removal
    if(max(group['criteria1']) == 0):    
        for x in range(rank1, rank1 + max(group['group_rank'])):
            hdf.loc[x,'remove_row'] = 1

我收到以下错误:

TypeError: int() argument must be a string or a number, not 'Int64Index'

当我尝试显式转换rank1时出现相同的错误我得到了同样的错误:

rank1 = int(group[group['auction_rank']==1].index)

有人可以解释发生了什么并提供替代方案吗?

2 个答案:

答案 0 :(得分:3)

您的具体问题的答案是index1是一个Int64Index(基本上是一个列表),即使它有一个元素。要获得该元素,您可以使用index1[0]

但是有更好的方法来实现你的目标。如果要删除“错误”组中的所有行,可以使用filter

hdf = hdf.groupby('group_id').filter(lambda group: group['criteria1'].max() != 0)

如果您只想删除匹配组中的某些行,可以编写一个函数,然后使用apply

def filter_group(group):
    if group['criteria1'].max() != 0:
        return group
    else:
        return group.loc[other criteria here]

hdf = hdf.groupby('group_id').apply(filter_group)

(如果你真的喜欢你目前的做事方式,你应该知道loc会接受一个索引,而不仅仅是一个整数,所以你也可以做hdf.loc[group.index, 'remove_row'] = 1)。

答案 1 :(得分:0)

在Int64Index对象上调用tolist()。然后可以将该列表迭代为int值。