Pyspark - 枢轴函数问题
Pyspark - Pivot function issue
输入应如下所示:
company
sales
amazon
100
flipkart
900
ebay
890
amazon
100
flipkart
100
ebay
10
amazon
100
flipkart
90
ebay
10
预期输出应如下所示:
amazon
flipkart
ebay
300
1090
910
尝试过使用枢轴函数,但它不起作用。任何帮助将不胜感激..提前致谢..
我一直在使用以下测试数据集来编写此解决方案:
data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
columns= ["company", "sales"]
df = spark.createDataFrame(data = data, schema = columns)
这将产生以下数据框:
+--------+-----+
|company |sales|
+--------+-----+
|amazon |100 |
|flipkart|300 |
|amazon |50 |
|ebay |50 |
|ebay |150 |
|amazon |300 |
+--------+-----+
对于您的特定宽度 table 我将执行以下操作:
df \
.groupBy("company") \
.pivot("company") \
.sum("sales")
Spark 将保存空值。函数 pivot
本身就很昂贵。
要真正获得结果,您可以执行以下操作,通过再次分组和求和来删除 null
值。
companies = list(
df.select('company').toPandas()['company'].unique()
)
pdf = df \
.groupBy("company") \
.pivot("company") \
.sum("sales") \
.groupBy() \
.agg(*[F.sum(c).alias(c) for c in companies])
结果是:
+------+--------+----+
|amazon|flipkart|ebay|
+------+--------+----+
| 450| 300| 200|
+------+--------+----+
使用 groupBy() 和 first() 函数。
data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
df = spark.createDataFrame(data,["company","sales"])
df.show()
+--------+-----+
| company|sales|
+--------+-----+
| amazon| 100|
|flipkart| 300|
| amazon| 50|
| ebay| 50|
| ebay| 150|
| amazon| 300|
+--------+-----+
df.groupBy("company").agg(sum("sales").alias("sales"))\
.groupBy().pivot("company").agg(first("sales")).show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
| 450| 200| 300|
+------+----+--------+
感谢@andy 提供帮助列解决方案
df.groupBy(lit(0).alias("Key")).pivot("company")\
.agg(sum("sales").alias("sales")).show()
+---+------+----+--------+
|Key|amazon|ebay|flipkart|
+---+------+----+--------+
| 0| 450| 200| 300|
+---+------+----+--------+
可以使用 drop() 函数删除键列
df.groupBy(lit(0).alias("Key")).pivot("company")\
.agg(sum("sales").alias("sales")).drop("key").show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
| 450| 200| 300|
+------+----+--------+
您可以使用其他答案中显示的 pivot()
功能。
这是 groupBy()
和 pivot()
组合的较短版本。
>>> data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
>>> df = spark.createDataFrame(data,["company","sales"])
>>> df.groupBy().pivot('company').sum('sales').show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
| 450| 200| 300|
+------+----+--------+
输入应如下所示:
company | sales |
---|---|
amazon | 100 |
flipkart | 900 |
ebay | 890 |
amazon | 100 |
flipkart | 100 |
ebay | 10 |
amazon | 100 |
flipkart | 90 |
ebay | 10 |
预期输出应如下所示:
amazon | flipkart | ebay |
---|---|---|
300 | 1090 | 910 |
尝试过使用枢轴函数,但它不起作用。任何帮助将不胜感激..提前致谢..
我一直在使用以下测试数据集来编写此解决方案:
data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
columns= ["company", "sales"]
df = spark.createDataFrame(data = data, schema = columns)
这将产生以下数据框:
+--------+-----+
|company |sales|
+--------+-----+
|amazon |100 |
|flipkart|300 |
|amazon |50 |
|ebay |50 |
|ebay |150 |
|amazon |300 |
+--------+-----+
对于您的特定宽度 table 我将执行以下操作:
df \
.groupBy("company") \
.pivot("company") \
.sum("sales")
Spark 将保存空值。函数 pivot
本身就很昂贵。
要真正获得结果,您可以执行以下操作,通过再次分组和求和来删除 null
值。
companies = list(
df.select('company').toPandas()['company'].unique()
)
pdf = df \
.groupBy("company") \
.pivot("company") \
.sum("sales") \
.groupBy() \
.agg(*[F.sum(c).alias(c) for c in companies])
结果是:
+------+--------+----+
|amazon|flipkart|ebay|
+------+--------+----+
| 450| 300| 200|
+------+--------+----+
使用 groupBy() 和 first() 函数。
data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
df = spark.createDataFrame(data,["company","sales"])
df.show()
+--------+-----+
| company|sales|
+--------+-----+
| amazon| 100|
|flipkart| 300|
| amazon| 50|
| ebay| 50|
| ebay| 150|
| amazon| 300|
+--------+-----+
df.groupBy("company").agg(sum("sales").alias("sales"))\
.groupBy().pivot("company").agg(first("sales")).show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
| 450| 200| 300|
+------+----+--------+
感谢@andy 提供帮助列解决方案
df.groupBy(lit(0).alias("Key")).pivot("company")\
.agg(sum("sales").alias("sales")).show()
+---+------+----+--------+
|Key|amazon|ebay|flipkart|
+---+------+----+--------+
| 0| 450| 200| 300|
+---+------+----+--------+
可以使用 drop() 函数删除键列
df.groupBy(lit(0).alias("Key")).pivot("company")\
.agg(sum("sales").alias("sales")).drop("key").show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
| 450| 200| 300|
+------+----+--------+
您可以使用其他答案中显示的 pivot()
功能。
这是 groupBy()
和 pivot()
组合的较短版本。
>>> data = [("amazon", 100), ("flipkart", 300), ("amazon", 50), ("ebay", 50), ("ebay", 150), ("amazon", 300)]
>>> df = spark.createDataFrame(data,["company","sales"])
>>> df.groupBy().pivot('company').sum('sales').show()
+------+----+--------+
|amazon|ebay|flipkart|
+------+----+--------+
| 450| 200| 300|
+------+----+--------+