我是pyspark的新手。我有以下类似于pandas的代码。
bindt = df[df[var].notnull()][var].quantile([0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1]).unique()
df['{0}_quartile'.format(var)] = pd.cut(df[var], bindt, labels=False, include_lowest=True )
我发现在pyspark 2.x中有'approxQuantile'方法,但在pyspark 1.6.0中没有。
我的样例输入:
df.show()
+-----------+----------+---------------+--------------+------------------------+
| id | col_1 |col_2 |col_3 |col_4 |
+-----------+----------+---------------+--------------+------------------------+
|1.10919E+16|3988487.35| -236751.43| -362208.07| 0.660000|
|1.10919E+16|3988487.35| -236751.43| -362208.07| 0.900000|
|1.10919E+16|3988487.35| -236751.43| -362208.07| 0.660000|
|1.10919E+16| 36718.55| null| null| 0.860000|
|1.10919E+16| 36718.55| null| null| 0.780000|
|1.10919E+16| 36718.55| null| null| 0.660000|
|1.10919E+16| 36718.55| null| null| 0.900000|
|1.10919E+16| 36718.55| null| null| 0.660000|
df.collect()
[Row(id=u'1.11312E+16', col_1=Decimal('367364.44'), col_2=Decimal('-401715.23'), col_3=Decimal('-1649917.53'), col_4=Decimal('0.080000')),
Row(id=u'1.11312E+16', col_1=Decimal('367364.44'), col_2=Decimal('-401715.23'), col_3=Decimal('-1649917.53'), col_4=Decimal('0.780000')),
Row(id=u'1.11312E+16', col_1=Decimal('367364.44'), col_2=Decimal('-401715.23'), col_3=Decimal('-1649917.53'), col_4=Decimal('0.780000')),
Row(id=u'1.11312E+16', col_1=Decimal('367364.44'), col_2=Decimal('-401715.23'), col_3=Decimal('-1649917.53'), col_4=Decimal('0.860000')),
Row(id=u'1.11312E+16', col_1=Decimal('367364.44'), col_2=Decimal('-401715.23'), col_3=Decimal('-1649917.53'), col_4=Decimal('0.330000'))]
我需要对所有输入列循环上述逻辑。
for var in df.columns:
bindt = df[df[var].notnull()][var].quantile([0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1]).unique()
df['{0}_quartile'.format(var)] = pd.cut(df[var], bindt, labels=False, include_lowest=True )
有人能提供一下如何将上述代码重写为pyspark 1.6 dataframe的建议吗?
谢谢。
+
、-
和|
这样的无意义符号使得复制粘贴数据样本变得非常困难。此外,您代码示例中的var
不在数据框中/不是一个定义的变量。 - JE_Muc