在Spark数据帧的转置期间。列名未转换为行标题

时间:2017-04-17 12:47:33

标签: python apache-spark pyspark rdd

我有Dataframe,名称'tbl'为,

summary col1    col2    col3        col200
count   20000   20000   20000       20000
mean    3.02    789.83  8379.02     20.03
std dev 1.02    2.03    0.8         0.56

我使用下面的代码进行了转置,

header = [i[0] for i in tbl.select("summary").rdd.map(tuple).collect()]
tt = tbl.select([c for c in tbl.columns if c not in ["summary"]])
rtt = tt.rdd.map(tuple)
rtt1 = rtt.zipWithIndex().flatMap(lambda (x,i): [(i,j,e) for (j,e) in enumerate(x)])
rtt2 = rtt1.map(lambda(i,j,e):(j,(i,e))).groupByKey().sortByKey()
rtt3 = rtt2.map(lambda (i,x):sorted(list(x), cmp=lambda(i1,e1),(i2,e2) : cmp(i1,i2)))

rtt4 = rtt3.map(lambda x: map(lambda (i,y):y, x))

问题:

在转置时,我可以生成诸如

之类的列
count   Mean    Std dev
20000   3.02    1.02
20000   789.83  2.03

但是这个转换缺少列标题名称来标识转置是针对哪个变量。我有'3 X 42000'维度的数据帧,所有列都是唯一的,看看如何识别如何在转置上添加列标题作为行标题。

1 个答案:

答案 0 :(得分:1)

如何使用熊猫:

df = sc.parallelize([(-1.0, 2.0, -3.0), (4.4, 5.1, -6.4)]).toDF()

pdf = df.describe().toPandas()
pdf.T[1:].rename(columns=pdf.T.iloc[0])

   count                mean              stddev   min   max
_1     2  1.7000000000000002   3.818376618407357  -1.0   4.4
_2     2                3.55   2.192031021678297   2.0   5.1
_3     2                -4.7  2.4041630560342617  -6.4  -3.0

你不需要Spark来处理120,000个值......