Удаление списка из Pandas DataFrame - PullRequest
1 голос
/ 13 октября 2019
    ProArticle                                          Vector

0   Iran jails blogger 14 years An Iranian weblogg...   [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
1   UK gets official virus alert site A rapid aler...   [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
2   OSullivan could run Worlds Sonia OSullivan ind...   [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
3   Mutant book wins Guardian prize A book evoluti...   [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
4   Microsoft seeking spyware trojan Microsoft inv...   [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...

Выше приведен фрагмент data.head () из векторизованной новостной статьи.

type(data.Vector[0]) - это list

Мне нужно использовать кластеризацию KMeans на этих векторизованных данных, но списки не позволят мне.

data.Vector.shape равно 179, а data.Vector[0].shape равно 8868.

Как я могу удалить список, или если я не могу, то как я могу использовать его для кластеризации данных? Возможно, я мог бы получить фрейм данных следующим способом, а затем запустить на нем PCA.

Ожидаемый результат выглядит следующим образом: enter image description here

1 Ответ

0 голосов
/ 13 октября 2019

Похоже, что вы хотите сделать, это создать двумерный массив из столбца Pandas, который содержит списки чисел. В большинстве случаев вы можете рассматривать столбец Pandas как список или одномерный массив Numpy. здесь вы можете использовать vstack для составления отдельных списков в виде строк:

>>> df = pd.DataFrame({
...     "ProArticle": ["a", "b", "c", "d"],
...     "Vector": [[0, 0], [1, 1], [2, 2], [3, 3]]
... })
>>> vs = np.vstack(df.Vector)
>>> vs
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3]])

Таким образом, это приводит к массиву, который вы можете использовать напрямую с KMeans sklearn:

>>> kmeans = KMeans(n_clusters=2)
>>> kmeans.fit_predict(vs)
array([1, 1, 0, 0], dtype=int32)

Если вы все еще хотите иметь промежуточный результат в качестве кадра данных Pandas, вы можете использовать apply для создания серии Pandas каждого списка;в соответствии с документацией apply это приводит к созданию DataFrame:

>>> df.Vector.apply(pd.Series)
   0  1
0  0  0
1  1  1
2  2  2
3  3  3

Затем вы можете получить тот же массив Numpy, обратившись к члену .values результирующего DataFrame. Однако это намного медленнее, чем решение vstack, 1 миллисекунда против 25,4 микро секунд на моей машине.

...