微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从行到列旋转多列

如何解决从行到列旋转多列

我有一个如下所示的PySpark数据框:

| 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  |

我想使policypayment_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。

解决方法

要旋转数据表,首先需要一个分组列来组合policypayment_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|
+---+----+------+------+--------+------+------+--------+

要获得与示例相同的列名,可以先将策略列的内容更改为policyno_policy,如下所示:

df = df.withColumn("policy",when(col("policy") == 1,"policy").otherwise("no_policy"))

这是用0替换缺少的值的方法:

df.na.fill(0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。