Как создать группы элементов и выбрать наибольшее значение? - PullRequest
0 голосов
/ 14 июля 2020

Привет, сообщество stackoverflow!

У меня есть набор данных:

0 A 0.000027769231 1 B 0.000030287440 0.628306 0.988151 1
0 A 0.000027479497 2 C 0.000035937793 0.581428 0.976041 1
1 B 0.000030287440 2 C 0.000035532483 0.516033 0.987388 1
4 D 0.000011085990 5 E 0.000008163211 0.577556 0.943583 1
4 D 0.000010787916 8 F 0.000008873166 0.531686 0.954017 1
5 E 0.000007865264 8 F 0.000008873166 0.691516 0.989945 1
311 G 0.000006216949 312 H 0.000002510852 0.829361 0.983148 1
326 M 0.000028129783 327 N 0.000011022112 0.843188 0.915627 1
326 M 0.000027462953 328 O 0.000002167529 1.742349 0.943267 1
326 M 0.000028024026 329 P 0.000005130416 1.263187 0.924010 1
326 M 0.000027630314 330 R 0.000002965539 1.668906 0.935518 1
326 M 0.000027721668 331 S 0.000002614498 1.851544 0.939051 1
326 M 0.000028129332 332 T 0.000003145471 1.742525 0.930186 1
327 N 0.000011020065 328 O 0.000002570277 2.473902 0.943474 1
327 N 0.000011028065 329 P 0.000005235456 1.447848 0.976569 1
327 N 0.000011032158 330 R 0.000003154471 2.303768 0.955479 1
327 N 0.000011025788 331 S 0.000002864823 2.038783 0.946972 1
327 N 0.000011064135 332 T 0.000003183160 1.213611 0.975056 1
328 O 0.000002505234 329 P 0.000005129224 1.549313 0.968629 1
328 O 0.000002452331 330 R 0.000002965465 2.328536 0.981076 1
329 P 0.000005147180 330 R 0.000003095314 2.803627 0.977268 1
329 P 0.000005208069 332 T 0.000003147536 2.658807 0.984912 1
330 R 0.000002967887 331 S 0.000002700052 1.208673 0.987825 1
330 R 0.000003110114 332 T 0.000003145140 2.428988 0.983747 1
331 S 0.000002853757 332 T 0.000003145464 1.551457 0.982276 1
366 I 0.000000326315 367 J 0.000000253986 1.410176 0.961879 1
366 I 0.000000327483 368 K 0.000000110327 1.236265 0.918510 1
366 I 0.000000326939 369 Q 0.000000165208 2.258098 0.907039 1
367 J 0.000000257330 368 K 0.000000113511 2.600934 0.907874 1
367 J 0.000000256872 369 Q 0.000000166861 1.102368 0.937099 1

В каждой строке у меня есть уникальная пара некоторых элементов, которые я указал здесь буквами. Я хочу создать группы из этих элементов и выбрать наибольшее значение из столбца 3 или 6 в каждой группе. Для этого набора данных я должен получить 4 группы с элементами и максимальное значение из столбца 3 или 6:

A
B
C
maxval: C: 0.000035937793
D
E
F
maxval: D: 0.000011085990
G
H
maxval: G: 0.000006216949
M
N
O
P
R
S
T
maxval: M: 0.000028129783
I
J
K
Q
maxval: I: 0.000000326939

Как вы можете заметить, если в строках есть более одного и того же элемента (например, A), значения в столбце 3 (для A) немного отличаются. Однако мы можем сделать предположение, что A имеет одинаковое значение столбца 3.

В качестве вывода я хочу получить три файла:

  1. список групп с maxval столбца 3 или 6
  2. список элементов с наибольшим значением из столбца 3 или 6. Я хочу также добавить 1 или 4 столбца для каждого элемента:
2 C
4 D
311 G
326 M
366 I
список с другими элементами из каждой группы:
0 A
1 B
5 E
8 F
312 H
327 N
328 O
329 P
330 R
331 S
332 T
367 J 
368 K
369 Q

Я понятия не имею, как сделать такой случай в Python. Может ли кто-нибудь помочь мне советами или частями кода?

1 Ответ

1 голос
/ 15 июля 2020

Я не уверен, отвечу ли я точно, что вы хотите, некоторые части мне непонятны, но, вероятно, небольшие корректировки можно легко внести в l oop.

С помощью pandas и numpy,

import pandas as pd
import numpy as np

Мы можем загрузить данные

data = pd.read_csv("data.txt", sep=" ", header=None)

И определить функцию

# https://stackoverflow.com/questions/39915402/combine-a-list-of-pairs-tuples
def make_equiv_classes(pairs):
    groups = {}
    for (x, y) in pairs:
        xset = groups.get(x, set([x]))
        yset = groups.get(y, set([y]))
        jset = xset | yset
        for z in jset:
            groups[z] = jset
    return set(map(tuple, groups.values()))

И создать наши классы

classes = make_equiv_classes( data.values[:,[1,4]] )

Затем для каждого класса

for cls in classes:
    max_cls = 0
    print(sorted(cls))

    sub_class = data.loc[data[1].isin(cls) | data[4].isin(cls)]
    max_class_value = np.max( sub_class.values[:,[2,5]] )
    
    subclass_argmax = np.argmax( np.max( sub_class.values[:,[2,5]], axis=1) )
    data_argmax = sub_class.iloc[subclass_argmax][0]
    
    first_letter = sub_class.iloc[subclass_argmax][1]
    second_letter = sub_class.iloc[subclass_argmax][4]

    print( "Max Class Value: {}".format(max_class_value))
    print( "Max Class Number: {}".format(data_argmax))
    print( "First letter: {}, Second Letter: {}".format(first_letter, second_letter))
    print( "\n")

будет напечатано

['M', 'N', 'O', 'P', 'R', 'S', 'T']
Max Class Value: 2.8129783000000003e-05
Max Class Number: 326
First letter: M, Second Letter: N


['G', 'H']
Max Class Value: 6.216949e-06
Max Class Number: 311
First letter: G, Second Letter: H


['D', 'E', 'F']
Max Class Value: 1.108599e-05
Max Class Number: 4
First letter: D, Second Letter: E


['I', 'J', 'K', 'Q']
Max Class Value: 3.27483e-07
Max Class Number: 366
First letter: I, Second Letter: K


['A', 'B', 'C']
Max Class Value: 3.5937793e-05
Max Class Number: 0
First letter: A, Second Letter: C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...