从 pandas 数据帧转换为 LabeledPoint RDD

Posted

技术标签:

【中文标题】从 pandas 数据帧转换为 LabeledPoint RDD【英文标题】:Convert from pandas dataframe to LabeledPoint RDD 【发布时间】:2017-03-22 10:39:32 【问题描述】:

我正在一个非常简单的数据集上运行一些测试,该数据集基本上由数字数据组成。 可以找到here。

我一直在使用 pandas、numpy 和 scikit-learn 很好,但是在迁移到 Spark 时,我无法以正确的格式设置数据以将其输入到决策树中。

我这样做没有用:

df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/poker/poker-hand-training-true.data')

raw_data = sc.parallelize(df)

train_dataset = raw_data.map(lambda line: line.split(","))\
                            .map(lambda line:LabeledPoint(line[10], np.array([float(x) for x in line[0:10]])))

尝试在 map 函数中访问 line 时,我不断收到 IndexError: list index out of range

当我实际下载文件并更改代码如下时,我才设法让它工作:

raw_data = sc.textFile('.../datasets/poker-hand-training.data')

train_dataset = raw_data.map(lambda line: line.split(","))\
                            .map(lambda line:LabeledPoint(line[10], np.array([float(x) for x in line[0:10]])))

如果我不想下载数据集,是否可以使用 read_csv 直接从 pandas 数据帧中获取数据?

【问题讨论】:

【参考方案1】:

我建议您先将Pandas DataFrame 转换为Spark DataFrame。您可以使用sqlContext.createDataFrame 方法来做到这一点。

df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/poker/poker-hand-training-true.data', names=['S1','C1','S2','C2','S3','C3','S4','C4','S5','C5','class'])
s_df = spark.createDataFrame(df)

现在您可以使用此 Dataframe 来获取您的训练数据集。

train_dataset  = s_df.rdd.map(lambda x: LabeledPoint(x[10], x[:10])).collect()

【讨论】:

最好的单行转换!

以上是关于从 pandas 数据帧转换为 LabeledPoint RDD的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 数据帧到 Spark 数据帧的转换需要大量时间

将列表写入 pandas 数据帧到 csv,从 csv 读取数据帧并再次转换为列表而无需字符串

直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵

用 NA 值填充 dict 以允许转换为 pandas 数据帧

通过 pyspark.sql.dataframe 将 XML 数据转换为 pandas 数据帧

将 pyspark 数据帧转换为 pandas 数据帧