从 Pandas DataFrame 中删除列表

Removal of List from Pandas DataFrame

    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.shape179data.Vector[0].shape8868

如何删除该列表,或者如果不能,那么如何使用它来对给定数据进行聚类?也许我可以通过以下方式开始获取数据框,然后在其上添加 运行 PCA。

预期输出如下所示:

您似乎想要做的是从包含数字列表的 Pandas 列创建一个 2D numpy 数组。在大多数情况下,您可以将 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]])

所以这会产生一个数组,您可以直接将其与 sklearn 的 KMeans 一起使用:

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

如果您仍然希望将中间结果作为 Pandas 数据框,您可以使用 apply 为每个列表创建 Pandas 系列;根据 apply's documentation 这导致 DataFrame:

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

然后您可以通过访问生成的 DataFrame 的 .values 成员来获取相同的 Numpy 数组。但是,这比 vstack 解决方案慢得多,1 毫秒对我机器上的 25.4 秒。