【发布时间】:2016-08-24 20:16:36
【问题描述】:
我有一个 PySpark 数据框
+-------+--------------+----+----+
|address| date|name|food|
+-------+--------------+----+----+
|1111111|20151122045510| Yin|gre |
|1111111|20151122045501| Yin|gre |
|1111111|20151122045500| Yln|gra |
|1111112|20151122065832| Yun|ddd |
|1111113|20160101003221| Yan|fdf |
|1111111|20160703045231| Yin|gre |
|1111114|20150419134543| Yin|fdf |
|1111115|20151123174302| Yen|ddd |
|2111115| 20123192| Yen|gre |
+-------+--------------+----+----+
我想转换为与 pyspark.ml 一起使用。我可以使用 StringIndexer 将名称列转换为数字类别:
indexer = StringIndexer(inputCol="name", outputCol="name_index").fit(df)
df_ind = indexer.transform(df)
df_ind.show()
+-------+--------------+----+----------+----+
|address| date|name|name_index|food|
+-------+--------------+----+----------+----+
|1111111|20151122045510| Yin| 0.0|gre |
|1111111|20151122045501| Yin| 0.0|gre |
|1111111|20151122045500| Yln| 2.0|gra |
|1111112|20151122065832| Yun| 4.0|ddd |
|1111113|20160101003221| Yan| 3.0|fdf |
|1111111|20160703045231| Yin| 0.0|gre |
|1111114|20150419134543| Yin| 0.0|fdf |
|1111115|20151123174302| Yen| 1.0|ddd |
|2111115| 20123192| Yen| 1.0|gre |
+-------+--------------+----+----------+----+
如何使用 StringIndexer 转换多个列(例如,name 和 food,每个都有自己的 StringIndexer),然后使用 VectorAssembler 生成特征向量?还是我必须为每列创建一个StringIndexer?
** 编辑**:这不是骗人的,因为我需要以编程方式对具有不同列名的多个数据框进行此操作。我不能使用VectorIndexer 或VectorAssembler,因为这些列不是数字。
** EDIT 2**: 一个暂定的解决方案是
indexers = [StringIndexer(inputCol=column, outputCol=column+"_index").fit(df).transform(df) for column in df.columns ]
我现在创建一个包含三个数据框的列表,每个数据框都与原始数据框和转换后的列相同。现在我需要加入然后形成最终的数据帧,但这非常低效。
【问题讨论】:
-
类似但不是真的。他为每个字符串索引器一次做一列,我需要同时对几列做,而不是每一个分开
-
那就不可能了。甚至输出是什么?
-
好的,这就是我想要的。然后我将编写一个 UDF。
-
你不想要更多类似
CountVectroizer的东西吗?
标签: python apache-spark pyspark