我有一个每季度存储水平的Dataframe, df1
:
| id | year | quarter | level |
|-----|------|---------|--------|
| 111 | 2021 | 1 | Silver |
| 111 | 2021 | 2 | Gold |
| 222 | 2021 | 1 | Bronze |
| 222 | 2021 | 2 | Silver |
我还有另一个Dataframe,存储相同的数据,但不按季度分组, df2
:
| id | level |
|-----|--------|
| 111 | Bronze |
| 222 | Gold |
我想计算两个Dataframe的最大级别,但由于(g)old<(s)ilver,无法使用max。有没有一种方法来做一个定制的最大捕获金>银>铜的规则?
我的预期输出是这样的。
| id | year | quarter | level |
|-----|------|---------|--------|
| 111 | 2021 | 1 | Silver |
| 111 | 2021 | 2 | Gold |
| 222 | 2021 | 1 | Gold |
| 222 | 2021 | 2 | Gold |
在遇到这个问题之前我试过:
output = (
df1.join(df2, on = ['id'])
.groupby('id', 'year', 'quarter')
.agg(
F.max(F.col('level')).alias('level') #would rank Silver greater than Gold
)
)
2条答案
按热度按时间mkshixfv1#
您还可以使用
when
表达与使用greatest
函数以获取最大值:或者通过使用定义顺序的Map文字,以及在结构上使用max的相同方法:
fruv7luv2#
您可以创建一个Map数组列,以便于按数组索引排序,并使用
greatest
得到你想要计算的最高水平。对于较新的spark版本,可以使用
array_position
: