Как в DataFrame оставить все уникальные значения начиная сверху?
Как в df_name_serial_number оставить все уникальные значения df_name_serial_number начиная сверху?
Приведу два примера, в обоих случаях данные одни и те же, в первом примере данные идут по порядку, во втором примере данные перемешанны (приближенные к реальным). Нужно отобрать уникальные значения обязательно НАЧИНАЯ СВЕРХУ в df_name_serial_number.
Исходные данные:
import pandas as pd
from itertools import combinations
#создаем df
df = pd.DataFrame(data={'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8], 'C': [9, 10, 11, 12], 'D': [13, 14, 15, 16], 'E': [17, 18, 19, 20], 'F': [21, 22, 23, 24], 'G': [25, 26, 27, 28], 'H': [29, 30, 31, 32], 'L': [33, 34, 35, 36], 'K': [37, 38, 39, 40], 'M': [41, 42, 43, 44], 'P': [45, 46, 47, 48]})
#создаем df_name_serial_number
cols = df.columns.to_list()
nums = list(range(len(cols)))
df_name_serial_number = pd.DataFrame(
[[f"{cols[a]}_{cols[b]}", a, b] for a, b in list(combinations(nums, 2))],
columns="name serial_number1 serial_number2".split())
- Пример
Данный пример приведен для понимания:
df_name_serial_number
name serial_number1 serial_number2
0 A_B 0 1
1 A_C 0 2
2 A_D 0 3
3 A_E 0 4
4 A_F 0 5
5 A_G 0 6
6 A_H 0 7
7 A_L 0 8
8 A_K 0 9
9 A_M 0 10
10 A_P 0 11
11 B_C 1 2
12 B_D 1 3
13 B_E 1 4
14 B_F 1 5
15 B_G 1 6
16 B_H 1 7
17 B_L 1 8
18 B_K 1 9
19 B_M 1 10
20 B_P 1 11
21 C_D 2 3
22 C_E 2 4
23 C_F 2 5
24 C_G 2 6
25 C_H 2 7
26 C_L 2 8
27 C_K 2 9
28 C_M 2 10
29 C_P 2 11
30 D_E 3 4
31 D_F 3 5
32 D_G 3 6
33 D_H 3 7
34 D_L 3 8
35 D_K 3 9
36 D_M 3 10
37 D_P 3 11
38 E_F 4 5
39 E_G 4 6
40 E_H 4 7
41 E_L 4 8
42 E_K 4 9
43 E_M 4 10
44 E_P 4 11
45 F_G 5 6
46 F_H 5 7
47 F_L 5 8
48 F_K 5 9
49 F_M 5 10
50 F_P 5 11
51 G_H 6 7
52 G_L 6 8
53 G_K 6 9
54 G_M 6 10
55 G_P 6 11
56 H_L 7 8
57 H_K 7 9
58 H_M 7 10
59 H_P 7 11
60 L_K 8 9
61 L_M 8 10
62 L_P 8 11
63 K_M 9 10
64 K_P 9 11
65 M_P 10 11
Как сделать вот такой результат, чтобы остались только уникальные значения в df_name_serial_number НАЧИНАЯ СВЕРХУ? Если внимательно посмотреть, во всех трех столбцах остались уникальные значения:
df_name_serial_number
name serial_number1 serial_number2
0 A_B 0 1
1 C_D 2 3
2 E_F 4 5
3 G_H 6 7
4 L_K 8 9
5 M_P 10 11
- Пример
В этом случае, а точнее всегда, они будут перемешены df_name_serial_number.
name serial_number1 serial_number2
0 A_K 0 9
1 A_E 0 4
2 F_P 5 11
3 A_C 0 2
4 B_D 1 3
5 A_G 0 6
6 K_P 9 11
7 A_L 0 8
8 A_B 0 1
9 A_M 0 10
10 A_P 0 11
11 B_C 1 2
12 A_F 0 5
13 B_E 1 4
14 B_F 1 5
15 B_G 1 6
16 B_H 1 7
17 B_L 1 8
18 B_K 1 9
19 B_M 1 10
20 B_P 1 11
21 C_D 2 3
22 C_E 2 4
23 C_F 2 5
24 C_G 2 6
25 C_H 2 7
26 C_L 2 8
27 C_K 2 9
28 C_M 2 10
29 C_P 2 11
30 D_E 3 4
31 D_F 3 5
32 D_G 3 6
33 D_H 3 7
34 D_L 3 8
35 D_K 3 9
36 D_M 3 10
37 D_P 3 11
38 E_F 4 5
39 E_G 4 6
40 E_H 4 7
41 E_L 4 8
42 E_K 4 9
43 E_M 4 10
44 E_P 4 11
45 F_G 5 6
46 F_H 5 7
47 F_L 5 8
48 F_K 5 9
49 F_M 5 10
50 A_D 0 3
51 G_H 6 7
52 G_L 6 8
53 G_K 6 9
54 G_M 6 10
55 G_P 6 11
56 H_L 7 8
57 H_K 7 9
58 H_M 7 10
59 H_P 7 11
60 L_K 8 9
61 L_M 8 10
62 L_P 8 11
63 K_M 9 10
64 A_H 0 7
65 M_P 10 11
Как сделать вот такой результат? Чтобы остались только уникальные значения НАЧИНАЯ СВЕРХУ во всем df_name_serial_number:
df_name_serial_number
name serial_number1 serial_number2
0 A_K 0 9
2 F_P 5 11
4 B_D 1 3
22 C_E 2 4
51 G_H 6 7
61 L_M 8 10
Ответы (1 шт):
Попробуйте так:
s = set()
keys = []
for name in df_name_serial_number["name"]:
a,b = name.split("_")
if a not in s and b not in s:
keys.append(name)
s |= set([a, b])
res = df_name_serial_number.query("name in @keys")
результат:
In [79]: res
Out[79]:
name serial_number1 serial_number2
0 A_K 0 9
2 F_P 5 11
4 B_D 1 3
22 C_E 2 4
51 G_H 6 7
61 L_M 8 10