【问题标题】:Removing observation with min value in a column out of the dataframe one by one using loop in Python使用Python中的循环一一删除数据框中列中具有最小值的观察值
【发布时间】:2026-01-18 02:30:02
【问题描述】:

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

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 的最小值。然后我想删除与数据帧中 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 使用循环索引处理新数据帧名称的方式非常不熟悉。我想我必须使用 dict 来放入新的数据框,但我不知道如何从 dict 中提取数据框的列,以及如何将新的数据框保存到 dict 中。有人可以帮帮我吗?

【问题讨论】:

    标签: python pandas dataframe loops min


    【解决方案1】:

    在我的解决方案中,输出是 DataFrames 列表。

    如果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]
    

    不是recommended,而是可以按组创建DataFrame:

    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
    

    【讨论】:

    • 我明白了。太感谢了。我很快就会试试看!
    • 请问i和g分别代表什么? i代表f3=a的位置,g代表f2的每个唯一值块吗?
    • @shuu i 这里是组名,这里用于分组的值是 10 和 12,g 是组。
    • 它有效。非常感谢:)
    最近更新 更多