У меня есть следующие панды DataFrame.

import pandas as pd
df = pd.read_csv('filename.csv')

print(df)

      A       B         C           D
0     2       0         11          0.053095
1     2       0         11          0.059815
2     0       35        11          0.055268
3     0       35        11          0.054573
4     0       1         11          0.054081
5     0       2         11          0.054426
6     0       1         11          0.054426
7     0       1         11          0.054426
8     42      7         3           0.048208
9     42      7         3           0.050765
10    42      7         3           0.05325

    ....

Проблема в том, что данные естественно «сгруппированы» в группы, но эти данные не приводятся. Из приведенного выше строки 0-1 представляют собой одну группу, строки 2-3 - группу, строки 4-7 - группу, а 8-10 - группу.

Мне нужно вменять эту информацию. Можно использовать машинное обучение; однако можно ли это сделать только с помощью панд?

Могут ли пользователи группироваться по значениям столбцов для создания этих групп? Проблема в том, что значения не точны . Для третьей группы столбец B имеет группы 1, 2, 1, 1.

0
ShanZhengYang 29 Июн 2016 в 03:04

1 ответ

Лучший ответ

Решение на чистом pandas будет включать в себя биннинг, предполагая, что ваши значения близки друг к другу, а размер вашего бункера достаточно велик для вариации кластера, но меньше, чем расстояние между значениями кластера. Этот ответ зависит от ваших данных.

Подход биннинга использует функцию cut в пандах. Вы предоставляете серию (или массив) и количество ячеек, которые хотите использовать для функции. Функция равномерно делит диапазон вашей серии на заданное количество ячеек и определяет, куда попадает каждое значение во входных данных. Результатом для приведенного ниже набора столбцов будет то, в какую ячейку попало значение, и по которому вы можете сгруппировать, следуя исходному ходу мыслей.

На практике для бункеров размером ~ 5 это будет выглядеть следующим образом:

for col in df.columns:
   binned_name = col + '_binned'
   num_bins = np.ceil(df[col].max()/5)
   df[binned_name] = pd.cut(df[col],num_bins,labels=False)
1
breucopter 29 Июн 2016 в 04:09
Это может сработать. Однако, если я правильно понимаю, это должно быть применено к нескольким столбцам. Проверьте, есть ли кластер с bin +/- в первом столбце, а затем проверьте, выполняется ли это для второго столбца и т. Д. В противном случае вы можете получить несколько кластеров в одном кластере.
 – 
ShanZhengYang
29 Июн 2016 в 21:45
Это может произойти, если размер вашего бункера слишком велик. Вы можете выполнить оптимизацию для нахождения коэффициента одномерного силуэта, но на этом этапе лучше использовать k-means для соблюдения многомерности данных. Этот ответ предназначен для удовлетворения условия использования groupby для кластеров, так что это способ функциональной инженерии ваших столбцов.
 – 
breucopter
29 Июн 2016 в 21:58
Допустим, мы используем размер ячейки +/- 1. Строки группы 2-3 и строки группы 4-7 по-прежнему будут сгруппированы в две группы? Даже если их значения для столбца A одинаковы?
 – 
ShanZhengYang
29 Июн 2016 в 22:40
Я думаю, это работает, но разве вам не нужно сравнивать бункеры? То есть значения бинов A и сравниваются со значениями бинов из B. При некоторых условиях A является правильным кластером. Если нет, продолжайте сравнивать. Возможно, я неправильно понимаю ваш код? Любая помощь / детали приветствуются. Спасибо
 – 
ShanZhengYang
3 Июл 2016 в 04:44
Резюме: я думаю, что это работает, но бывают случаи, когда мне нужно сгруппировать по «A_binned». «A_binned» может содержать две группы (например, все значения в A_binned одинаковы, потому что значения в A одинаковы - см. Групповые строки 2-3 и групповые строки 4-7). Затем нам нужно сравнить эти значения с «B_binned». Любые идеи?
 – 
ShanZhengYang
3 Июл 2016 в 05:39