ProArticle Vector0 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
。
我该如何移除列表,或者如果不能移除,我该如何使用它来聚类给定的数据?或许我可以先按照以下方式获取一个DataFrame,然后对其运行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)>>> vsarray([[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 DataFrame,你可以使用apply
来创建每个列表的Pandas系列;根据apply
的文档,这将生成一个DataFrame:
>>> df.Vector.apply(pd.Series) 0 10 0 01 1 12 2 23 3 3
然后,你可以通过访问生成的DataFrame的.values
成员来获取相同的Numpy数组。然而,这种方法比vstack
解决方案慢得多,在我的机器上,1毫秒对比25.4微秒。