如何解决从行到列旋转多列
| id | name | policy | payment_name | count |
|------|--------|------------|--------------|-------|
| 2 | two | 0 | Hybrid | 58 |
| 2 | two | 1 | Hybrid | 2 |
| 5 | five | 1 | Excl | 13 |
| 5 | five | 0 | Excl | 70 |
| 5 | five | 0 | Agen | 811 |
| 5 | five | 1 | Agen | 279 |
| 5 | five | 1 | Hybrid | 600 |
| 5 | five | 0 | Hybrid | 2819 |
我想使policy
和payment_name
的组合成为具有相应计数的列(每id
减少到一行)。
输出看起来像这样:
| id | name | no_policy_hybrid | no_policy_excl | no_policy_agen | policy_hybrid | policy_excl | policy_agen |
|----|------|------------------|----------------|----------------|---------------|-------------|-------------|
| 2 | two | 58 | 0 | 0 | 2 | 0 | 0 |
| 5 | five | 2819 | 70 | 811 | 600 | 13 | 279 |
在没有组合的情况下,我们可以将其默认设置为0,即id
2没有包括payment_name
在内的组合,因此示例输出中将其设置为0。
解决方法
要旋转数据表,首先需要一个分组列来组合policy
和payment_name
。
df = df.withColumn("groupingCol",udf("{}_{}".format)("policy","payment_name"))
拥有该名称后,您可以按id and
name`列进行分组并旋转分组列。
df.groupBy("id","name").pivot("groupingCol").agg(F.max("count"))
那应该返回正确的表列。
+---+----+------+------+--------+------+------+--------+
| id|name|0_Agen|0_Excl|0_Hybrid|1_Agen|1_Excl|1_Hybrid|
+---+----+------+------+--------+------+------+--------+
| 5|five| 811| 70| 2819| 279| 13| 600|
| 2| two| null| null| 58| null| null| 2|
+---+----+------+------+--------+------+------+--------+
要获得与示例相同的列名,可以先将策略列的内容更改为policy
和no_policy
,如下所示:
df = df.withColumn("policy",when(col("policy") == 1,"policy").otherwise("no_policy"))
这是用0
替换缺少的值的方法:
df.na.fill(0)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。