使用 Python 中的循环逐个删除数据框中列中具有最小值的观察值

Removing observation with min value in a column out of the dataframe one by one using loop in Python

我有一个如下所示的数据框“数据”:

f1 f2 f3
11 34 a
14 10 a
20 12 a
15 19 b
19 29 b
29 30 b

如果f3是a,我想找到f2的最小值。我不想为 f3 = a 或 f3 = b 找到 f2 的最小值,就在 f3 = a 时。然后我想删除与数据框中 f2 中的最小值相关联的观察值。所以我有这个代码:

a_part = data[data['f3'] == 'a'
min1 = a_part['f2'].min()
min1 = data['f2'] = min1
data_new_1 = pd.dataframe(data.loc[~min1])

效果很好。现在我的数据框看起来像:

f1 f2 f3
11 34 a
20 12 a
15 19 b
19 29 b
29 30 b

但是,我想通过使用循环逐个删除 f3 = a 时 f2 的最小值和相关的观察值,并且每次都有一个新的数据帧。所以基本上 data_new_2 看起来像:

f1 f2 f3
11 34 a
15 19 b
19 29 b
29 30 b

直到f3只剩下b。我试着为它做一个循环:

for i in range(1,6):
    IN = data_new_i[['f3'] == 'a']
    min1 = a_part['f2'].min() 
    min1 = data_new_i['f2'] == min1
    vars()[data_new_i++] = pd.DataFrame(data.loc[~min1])

这是行不通的。我非常不熟悉 Python 使用循环索引处理新数据帧名称的方式。我想我必须使用字典来放入新的数据框,但我不知道如何从字典中提取数据框的列,以及如何将新的数据框保存到字典中。有人可以帮我吗?

在我的解决方案中,输出是数据帧列表。

如果列 f2 中始终存在唯一值,请按排序列的索引值使用循环并按最小值删除行:

out = []
data1 = data.sort_values('f2')
for i in data1.loc[data1['f3'] == 'a', 'f2'].index:
    data = data.drop(i)
    out.append(data)
print (out)
[   f1  f2 f3
0  11  34  a
2  20  12  a
3  15  19  b
4  19  29  b
5  29  30  b,    f1  f2 f3
0  11  34  a
3  15  19  b
4  19  29  b
5  29  30  b,    f1  f2 f3
3  15  19  b
4  19  29  b
5  29  30  b]

如果可能重复并需要删除所有重复项,就像这里在第一个循环中使用 f2=10 使用的所有行:

print (data)
   f1  f2 f3
0  11  10  a
1  14  10  a
2  20  12  a
3  15  19  b
4  19  29  b
5  29  30  b

out = []
data1 = data.sort_values('f2')
for i, g in data1.groupby(data1.loc[data1['f3'] == 'a', 'f2']):
    data = data.drop(g.index)
    out.append(data)
print (out)
[   f1  f2 f3
2  20  12  a
3  15  19  b
4  19  29  b
5  29  30  b,    f1  f2 f3
3  15  19  b
4  19  29  b
5  29  30  b]

不是,但可以按组创建数据帧:

data1 = data.sort_values('f2')
for j, (i, g) in enumerate(data1.groupby(data1.loc[data1['f3'] == 'a', 'f2']), 1):
    data = data.drop(g.index)
    globals()[f'data_new_{j}'] = data
print (data_new_1)
   f1  f2 f3
2  20  12  a
3  15  19  b
4  19  29  b
5  29  30  b

print (data_new_2)
   f1  f2 f3
3  15  19  b
4  19  29  b
5  29  30  b