Pyspark:只对行之间的子集进行重新排序



我的数据帧:

+-----+--------+-------+
| val |  id    | reRnk |
+-----+--------+-------+
| 2   | a      | yes   |
| 1   | b      | no    |
| 3   | c      | no    |
| 8   | d      | yes   |
| 7   | e      | yes   |
| 9   | f      | no    |
+-----+--------+-------+

在我想要的输出中,我将仅对reRnk==是的列进行重新排序;val";我不想更改reRnk=no的行,例如,在id=b处,我们有reRnk=no。我只想将该行保留在第2行。我想要的输出是这样的:

+-----+--------+-------+
| val |  id    | reRnk |
+-----+--------+-------+
| 8   | d      | yes   |
| 1   | b      | no    |
| 3   | c      | no    |
| 7   | e      | yes   |
| 2   | a      | yes   |
| 9   | f      | no    |
+-----+--------+-------+

根据我所读到的内容,pyspark DF默认情况下没有索引。您可能需要添加此项。

我不知道pyspark的确切语法,但由于它与panda有很多相似之处,这可能会引导你走向某个方向:

df.loc[df.reRnk == 'yes', ['val','id']] = df.loc[df.reRnk == 'yes', ['val','id']].sort_values('val', ascending=False).set_index(df.loc[df.reRnk == 'yes', ['val','id']].index)

基本上,我们在这里所做的是用reRnk == 'yes'隔离行,对这些值进行排序,但将索引重置为其原始索引。然后,我们将这些新值分配给df中的原始行。

对于CCD_ 2,https://spark.apache.org/docs/3.2.0/api/python/reference/pyspark.pandas/api/pyspark.pandas.DataFrame.loc.html也许值得一试。

对于.sort_values,请参见:https://sparkbyexamples.com/pyspark/pyspark-orderby-and-sort-explained/

相关内容

  • 没有找到相关文章

最新更新