如何对可互换的两列组合分组并求和Total列?
解决方案
不管你用的是PySpark还是Pandas,核心思路都是给双向组合生成统一的分组标识,让X→Y和Y→X拥有相同的分组键,再基于这个键求和。以下是两种主流框架的实现:
针对PySpark DataFrame
from pyspark.sql import functions as F # 1. 生成排序后的分组键:将Start和End组成数组并排序,确保双向组合键一致 df_with_key = df.withColumn("group_key", F.array_sort(F.array("Start", "End"))) # 2. 按统一键分组,对Total求和 summed_df = df_with_key.groupBy("group_key").agg(F.sum("Total").alias("Total")) # 3. 拆分分组键为Start和End列,整理最终结果 result_df = summed_df.select( F.col("group_key")[0].alias("Start"), F.col("group_key")[1].alias("End"), "Total" ) # 查看结果 result_df.show()
针对Pandas DataFrame
import pandas as pd # 1. 生成排序后的元组作为分组键 df["group_key"] = df.apply(lambda row: tuple(sorted([row["Start"], row["End"]])), axis=1) # 2. 按分组键求和,重置索引 summed_df = df.groupby("group_key")["Total"].sum().reset_index() # 3. 拆分分组键为Start和End列,整理列顺序 summed_df[["Start", "End"]] = pd.DataFrame(summed_df["group_key"].tolist(), index=summed_df.index) result_df = summed_df[["Start", "End", "Total"]] # 查看结果 print(result_df)
原理说明
通过array_sort(PySpark)或sorted(Pandas)对Start和End的组合进行排序,使得任意双向组合(如X-Y和Y-X)生成完全相同的分组键,这样分组求和时就能自动合并双向数据,最后再将分组键拆回原列格式即可得到预期结果。
内容的提问来源于stack exchange,提问作者ifNameEqMain
相关产品推荐
相关产品推荐

