使用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中的循环一一删除数据框中列中具有最小值的观察值的主要内容,如果未能解决你的问题,请参考以下文章