我正在遍历一个数据帧(称为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'
当我尝试显式强制转换等级1时,出现相同的错误:
rank1 = int(group[group['auction_rank']==1].index)
有人可以解释正在发生的事情并提供替代方案吗?
最佳答案
您的特定问题的答案是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
)。