2015-10-13 326 views
2

我通过一个数据框(称为HDF)迭代和按行的基础上连续应用更改。 hdf按group_id排序,并根据某些标准分配1到n的排名。转换Int64Index为Int

# 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' 

我得到同样的错误,当我尝试显式强制等级-1中,我得到了同样的错误:

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

谁能解释发生了什么并提供替代方案?

+0

这并不完全清楚你在问什么。 'index1 = group [group ['group_rank'] == 1] .index'行返回所有行号的列表,其中'group_rank'等于1.这意味着将其转换为整数? –

+0

group_rank对每个组都是唯一的。因此,如果有一个组内的5行,该组行列将1至5 我将最终从HDF其中remove_row = 1找出是否一个行的逻辑应该从HDF移除删除所有行需要被在groupby for循环中完成。我需要hdf索引来进行保持hdf的更改,而不是组数据框。 loc函数接受的不是Int64Index。 –

+1

你想删除整个组如果'MAX(集团[“标准1”] == 0'? –

回答

1

回答你的具体问题是,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)。

+0

比方说,我有多个删除条件和一个相当大的数据集。我是否会通过使用单个循环(单个循环)(根据我的示例)提高性能,还是创建多个函数和每个groupby调用都能达到同样的性能? –

+0

如果您总是分组在同一个东西上,几乎可以肯定这个单一的groupby会更快。 –

+0

谢谢!这么容易,但在你的帮助之前挣扎了一段时间:) – sparrow