Найти минимальную строку в списке кортежей с повторяющимися значениями - PullRequest
1 голос
/ 22 февраля 2020

Не устраивает название, но я не уверен, как его улучшить.

У меня есть список кортежей из 3 элементов с повторяющимися значениями для первых 2 элементов. По сути, она представляет собой вид матрицы (скажем, 2 * 3):

[(a0, b0, val), (a0, b1, val), (a0, b2, val), (a1, b0, val), (a1, b1, val), (a1, b2, val)]

Она представляет собой матрицу, которая выглядит следующим образом:

     b0  b1  b2
a0  val val val
a1  val val val

Для каждой строки я хочу получить к значению b, соответствующему низшему значению. Я очень устал, и то, что я придумал, неудовлетворительно в лучшем случае .

На конкретном c примере вот что я сделал:

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. Обратите внимание, что в данном конкретном c случае это указывает на одно и то же значение b для каждой строки, это случайно и не должно приниматься.

Хотя это технически работает, я должен скажем, я редко видел уродливый код. Я уверен, что должен быть намного более умный и более ясный способ сделать то, к чему я хочу добраться. Любые предложения?

Заметьте также, что я могу заранее знать, сколько есть «повторений» (то есть размер набора b), если это абсолютно необходимо.

1 Ответ

1 голос
/ 22 февраля 2020
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...