如何在python中从一个列表中选择多个非连续列到另一个数据帧中



我正在处理IpythonSpark,我有一个RDD,从中我形成了list。现在,从这个list,我想形成一个dataframe,它有来自父list的多个列,但这些列不是连续的。我写了这个,但它似乎工作错误:

list1 = rdd.collect()
columns_num = [1,8,11,17,21,24]
df2 = [list[i] for i in columns_num]

上面的代码只从父list中选择了6行,其中只有第1列的数据,并用这6行的第1列数据形成新的dataframe

如何从另一个list 形成具有多个不连续列的新dataframe

例如:

rdd = sc.parallelize([("a", 1, 2, 4.0, "foo"), ("b", 3, 4, 5.0, "bar")])
columns_num = [0, 3]
df = rdd.toDF()
df2 = df.select(*(df.columns[i] for i in columns_num))
df2.show()
##  +---+---+
##  | _1| _4|
##  +---+---+
##  |  a|4.0|
##  |  b|5.0|
##  +---+---+

或者像这样:

df = rdd.map(lambda row: [row[i] for i in columns_num]).toDF()
df.show()
##  +---+---+
##  | _1| _4|
##  +---+---+
##  |  a|4.0|
##  |  b|5.0|
##  +---+---+

从另一方面来说,你永远不应该仅仅为了重塑而收集数据。在最好的情况下,它会很慢,在最坏的情况下它只会崩溃。

有了Optimus,这真的很容易。你只需要安装它与:

 pip install optimuspyspark

然后你导入它(它会为你启动Spark):

import optimus as op

让我们创建DF:

rdd = sc.parallelize([("a", 1, 2, 4.0, "foo"), ("b", 3, 4, 5.0, "bar")])
df = rdd.toDF()

并启动变压器:

transformer = op.DataFrameTransformer(df)

并选择您的列

df_new = transformer.select_idx([0,2]).df

现在你有了:

df_new.show()
+---+---+
| _1| _3|
+---+---+
|  a|  2|
|  b|  4|
+---+---+

相关内容

  • 没有找到相关文章

最新更新