使用 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
我有一个如下所示的数据框“数据”:
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