Python 在具有重复值的元组列表中查找最小行
我对这个头衔不满意,但我不知道如何让它变得更好 我有一个由3个元素组成的元组列表,其中前2个元素的值是重复的。基本上,它代表一种矩阵(比如说2*3): 它表示一个矩阵,如下所示: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
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