问题描述
我有一个以位置和性别作为字符串值的数据框,我想按降序查看按男性和女性计数划分的前20个位置。这是我到目前为止的代码,但未按desc排序。我该怎么办?
display(Markdown("**Top 20 locations** with highest active users split by sex ratio (in \%):"))
pivotDF = datingDF.groupBy("location").pivot("sex"). count()
pivotDF.show(truncate=False)
+-------------------------+----+----+
|location |f |m |
+-------------------------+----+----+
|mill valley,california |176 |139 |
|london,united kingdom |null|1 |
|west oakland,california |3 |4 |
|freedom,california |1 |null|
|columbus,ohio |null|1 |
|rochester,michigan |1 |null|
|mountain view,california|106 |278 |
|magalia,california |null|1 |
|san rafael,california |340 |415 |
|nicasio,california |1 |2 |
|santa cruz,california |null|5 |
|moss beach,california |3 |5 |
|muir beach,california |null|1 |
|larkspur,california |35 |45 |
|san quentin,california |1 |1 |
|kentfield,california |7 |11 |
|montara,california |9 |3 |
|brooklyn,new york |1 |2 |
|utica,michigan |null|1 |
|burlingame,california |154 |207 |
+-------------------------+----+----+
解决方法
我没有得到想要精确排序的方式,是按f
和m
列的总和还是按多列进行的。
- 总和:
pivotDF = pivotDF.orderBy((F.col('f') + F.col('m')).desc())
- 对于多列:
pivotDF = pivotDF.orderBy(F.col('f').desc(),F.col('m').desc())
,
您可以使用orderBy
orderBy(*cols,**kwargs)
返回按指定列排序的新DataFrame。
参数
cols –要作为排序依据的列或列名称的列表。
升序 –布尔值或布尔值列表(默认为True)。升序与降序排序。指定多个排序顺序的列表。如果一个 指定了list,列表的长度必须等于cols的长度。
datingDF.groupBy("location").pivot("sex").count().orderBy("F","M",ascending=False)
如果您希望一个上升而另一个下降,则可以执行以下操作。
datingDF.groupBy("location").pivot("sex").count().orderBy("F",ascending=[1,0])