Python 在具有重复值的元组列表中查找最小行

Python 在具有重复值的元组列表中查找最小行,python,numpy,tuples,Python,Numpy,Tuples,我对这个头衔不满意,但我不知道如何让它变得更好 我有一个由3个元素组成的元组列表,其中前2个元素的值是重复的。基本上,它代表一种矩阵(比如说2*3): 它表示一个矩阵,如下所示: b0 b1 b2 a0 val val val a1 val val val 对于每一行,我都想得到对应于最低值的b值。我很累,我得到的结果最多也不令人满意 在一个具体的例子中,以下是我所做的: res = [(915, 1584, 2618.40972202602), (915, 3835, 32

我对这个头衔不满意,但我不知道如何让它变得更好

我有一个由3个元素组成的元组列表,其中前2个元素的值是重复的。基本上,它代表一种矩阵(比如说2*3):

它表示一个矩阵,如下所示:

     b0  b1  b2
a0  val val val
a1  val val val
对于每一行,我都想得到对应于最低值的b值。我很累,我得到的结果最多也不令人满意

在一个具体的例子中,以下是我所做的:

res = [(915, 1584, 2618.40972202602), (915, 3835, 323.293876052119), (915, 7483, 1521.50879590718), (916, 1584, 2609.47030580952), (916, 3835, 314.354459835623), (916, 7483, 1512.56937969069), (1346, 1584, 3012.63009273444), (1346, 3835, 717.514246760547), (1346, 7483, 1582.83428580677), (4281, 1584, 2603.7125461067), (4281, 3835, 308.596700132804), (4281, 7483, 1464.5140765524), (4282, 1584, 2608.78719959729), (4282, 3835, 313.671353623393), (4282, 7483, 1459.43942306181), (4283, 1584, 2614.00974611433), (4283, 3835, 318.89390014043), (4283, 7483, 1454.21687654477), (4284, 1584, 2619.17131078887), (4284, 3835, 324.05546481497), (4284, 7483, 1449.05531187023), (4287, 1584, 2634.63255731146), (4287, 3835, 339.516711337566), (4287, 7483, 1433.59406534764), (4288, 1584, 2639.73617965108), (4288, 3835, 344.620333677179), (4288, 7483, 1428.49044300803), (4290, 1584, 2650.08066128732), (4290, 3835, 354.96481531342), (4290, 7483, 1418.14596137178), (4297, 1584, 2592.7709526482), (4297, 3835, 297.655106674305), (4297, 7483, 1475.4556700109), (4298, 1584, 2597.94359872049), (4298, 3835, 302.827752746592), (4298, 7483, 1470.28302393861), (4299, 1584, 2603.13534825911), (4299, 3835, 308.019502285211), (4299, 7483, 1465.09127439999), (4305, 1584, 2580.83715850017), (4305, 3835, 285.721312526271), (4305, 7483, 1487.38946415893), (4306, 1584, 2575.62363753943), (4306, 3835, 280.507791565529), (4306, 7483, 1492.60298511968), (4310, 1584, 2555.06067283699), (4310, 3835, 259.94482686309), (4310, 7483, 1513.16594982211), (8350, 1584, 2618.12918933735), (8350, 3835, 323.013343363448), (8350, 7483, 1478.93071978304), (8351, 1584, 2632.5746391363), (8351, 3835, 337.458793162408), (8351, 7483, 1493.376169582)]

r = np.array(res)

c = np.unique(r[:,0])

for val in c:
    d = (val, r[r[:,2]==np.amin(r[r[:,0]==val][:,2])][0,1], r[r[:,2]==np.amin(r[r[:,0]==val][:,2])][0,2])
    print(d)

>>> (915.0, 3835.0, 323.293876052119)
>>> (916.0, 3835.0, 314.354459835623)
>>> (1346.0, 3835.0, 717.514246760547)
>>> (4281.0, 3835.0, 308.596700132804)
>>> (4282.0, 3835.0, 313.671353623393)
>>> (4283.0, 3835.0, 318.89390014043)
>>> (4284.0, 3835.0, 324.05546481497)
>>> (4287.0, 3835.0, 339.516711337566)
>>> (4288.0, 3835.0, 344.620333677179)
>>> (4290.0, 3835.0, 354.96481531342)
>>> (4297.0, 3835.0, 297.655106674305)
>>> (4298.0, 3835.0, 302.827752746592)
>>> (4299.0, 3835.0, 308.019502285211)
>>> (4305.0, 3835.0, 285.721312526271)
>>> (4306.0, 3835.0, 280.507791565529)
>>> (4310.0, 3835.0, 259.94482686309)
>>> (8350.0, 3835.0, 323.013343363448)
>>> (8351.0, 3835.0, 337.458793162408)
然后可以将其放回另一个“仅限最小行”numpy数组中。注意,在这种特定情况下,每一行都指向相同的b值,这是“偶然”的,不应假设

虽然这在技术上是可行的,但我必须说我很少看到更丑陋的代码。我确信必须有一种更聪明、更清晰的方式来做我想做的事情。有什么建议吗

还要注意的是,如果绝对需要的话,我可以事先知道有多少个“重复”(即b集的大小)

df = pd.DataFrame(data=res, columns=['0', '1', '2'])
print(df.loc[df.groupby('0')['2'].idxmin()])
结果:

       0     1           2
1    915  3835  323.293876
4    916  3835  314.354460
7   1346  3835  717.514247
10  4281  3835  308.596700
13  4282  3835  313.671354
16  4283  3835  318.893900
19  4284  3835  324.055465
22  4287  3835  339.516711
25  4288  3835  344.620334
28  4290  3835  354.964815
31  4297  3835  297.655107
34  4298  3835  302.827753
37  4299  3835  308.019502
40  4305  3835  285.721313
43  4306  3835  280.507792
46  4310  3835  259.944827
49  8350  3835  323.013343
52  8351  3835  337.458793

您的问题被归类为数据操纵/模糊不清。Numpy不是处理此问题的好工具。你最好使用熊猫。该死,没想到这个,谢谢!它似乎工作得很好,我会张贴更好的答案,一旦我得到这个去。是的,就是这样。我没有想过要用熊猫,谢谢!
       0     1           2
1    915  3835  323.293876
4    916  3835  314.354460
7   1346  3835  717.514247
10  4281  3835  308.596700
13  4282  3835  313.671354
16  4283  3835  318.893900
19  4284  3835  324.055465
22  4287  3835  339.516711
25  4288  3835  344.620334
28  4290  3835  354.964815
31  4297  3835  297.655107
34  4298  3835  302.827753
37  4299  3835  308.019502
40  4305  3835  285.721313
43  4306  3835  280.507792
46  4310  3835  259.944827
49  8350  3835  323.013343
52  8351  3835  337.458793