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

Posted

技术标签:

【中文标题】使用Python中的循环一一删除数据框中列中具有最小值的观察值【英文标题】:Removing observation with min value in a column out of the dataframe one by one using loop in Python 【发布时间】:2021-11-12 00:26:50 【问题描述】:

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

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 中。有人可以帮帮我吗?

【问题讨论】:

【参考方案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 是组。 它有效。非常感谢:)

以上是关于使用Python中的循环一一删除数据框中列中具有最小值的观察值的主要内容,如果未能解决你的问题,请参考以下文章

计算数据框中列中的组

重命名数据框中列中的字符变量 - R

动态填充pyspark数据框中列中的行

做某事。如果在熊猫数据框中列中的值等于 1

什么函数允许我根据R中列中的值从数据框中的列中提取数据?

返回数据框中列中特定值的行号