У меня есть фрейм данных с именем df, который нравится, но на самом деле он [9147 строк x 3 столбца]
indexID RngUni[m] PowUni[dB]
157203 1.292283 132
157201 1.271878 132
157016 1.285481 134
157404 1.305886 136
157500 1.353496 136
157524 1.251474 136
157227 1.292283 132
157543 1.339893 136
157903 1.353496 138
156928 1.299084 134
157373 1.299084 136
156937 1.414709 134
157461 1.353496 136
157718 1.360297 138
157815 1.326290 138
157806 1.271878 134
156899 1.360298 134
157486 1.414709 138
157628 1.271878 136
157405 1.299084 134
157244 1.299084 134
157522 1.258275 136
157515 1.367099 138
157086 1.305886 136
157602 1.251474 134
157131 1.265077 132
157170 1.380702 138
156904 1.360297 134
157209 1.401106 138
157018 1.265077 134
Я пытаюсь выбрать определенные значения данных в таблице.
df.plot(x = 'RngUni[m]', y = 'PowUni[dB]', kind = 'scatter') дает: 
Предполагая, что основная группа - это область, в которой кластеризуется большая часть точек данных, мне нужно выбрать 80% точек, которые находятся в основной группе, и 20% точек, которые находятся за пределами основной группы.
Мне нужен indexID всех точек, выводимых в виде списка. Как я могу это сделать?
Пример требуемой кластеризации. Что я хотел бы сделать, так это выбрать 80% точек в круге и 20% точек за пределами круга.







Вот как я подойду к этой задаче:
from io import StringIO
import pandas as pd
from sklearn.cluster import KMeans
s = '''indexID RngUni[m] PowUni[dB]
157203 1.292283 132
157201 1.271878 132
157016 1.285481 134
157404 1.305886 136
157500 1.353496 136
157524 1.251474 136
157227 1.292283 132
157543 1.339893 136
157903 1.353496 138
156928 1.299084 134
157373 1.299084 136
156937 1.414709 134
157461 1.353496 136
157718 1.360297 138
157815 1.326290 138
157806 1.271878 134
156899 1.360298 134
157486 1.414709 138
157628 1.271878 136
157405 1.299084 134
157244 1.299084 134
157522 1.258275 136
157515 1.367099 138
157086 1.305886 136
157602 1.251474 134
157131 1.265077 132
157170 1.380702 138
156904 1.360297 134
157209 1.401106 138
157018 1.265077 134'''
ss = StringIO(s)
df = pd.read_csv(ss, sep=r"\s+")
kmeans = KMeans(n_clusters=2, random_state=0).fit(df.values[:,[1,2]])
df['labels']=kmeans.labels_
df['labels']=kmeans.labels_
df.labels.apply(lambda x: 'red' if x==1 else 'blue')
plt.scatter(x=df['RngUni[m]'], y=df['PowUni[dB]'], c=df['labels'])
Просто измените алгоритм кластеризации и поиграйте с параметрами, чтобы получить желаемые кластеры и цвета.
Надеюсь, это поможет.
Я только что прочитал эту ссылку о kmeans (scikit-learn.org/stable/modules/generated/…) и до сих пор не совсем понимаю, как я могу вывести список точек, которые были сгруппированы вместе.
Похоже, что у Kmeans есть разделение по некоторой границе принятия решений. Однако то, что мне нужно, может быть не разделением по линии, а по форме. Я отредактировал свой вопрос, чтобы включить это.
@RuvenGuna Если вы разместите полные данные, я могу показать, как можно изменить алгоритм кластеризации и получить желаемый кластер. Я использовал KMeans только для демонстрации идеи.
К сожалению, я не могу этого сделать, так как мне не разрешено загружать все данные. Но мне удалось решить проблему. Спасибо за вашу помощь!
Привет! Спасибо за ваш комментарий. Мне просто интересно, что представляют собой два разных цвета на вашем графике? А как мне вывести список индексов выбранных точек?