Python 具有不同列的Pysaprk多groupby
我有如下数据Python 具有不同列的Pysaprk多groupby,python,apache-spark,pyspark,count,Python,Apache Spark,Pyspark,Count,我有如下数据 year name percent sex 1880 John 0.081541 boy 1881 William 0.080511 boy 1881 John 0.050057 boy 我需要使用不同的列进行分组和计数 df_year = df.groupby('year').count() df_name = df.groupby('name').count() df_sex = df.groupby('se
year name percent sex
1880 John 0.081541 boy
1881 William 0.080511 boy
1881 John 0.050057 boy
我需要使用不同的列进行分组和计数
df_year = df.groupby('year').count()
df_name = df.groupby('name').count()
df_sex = df.groupby('sex').count()
然后,我必须创建一个窗口,以按每列获取前3名的数据
window = Window.partitionBy('year').orderBy(col("count").desc())
top4_res = df_year.withColumn('topn', func.row_number().over(window)).\
filter(col('topn') <= 4).repartition(1)
假设我有数百列要执行groupby和count以及topk_3操作
我能一次做完吗
或者有更好的方法吗?如果您想要拥有最大计数的列的前n个值,这应该可以:
from pyspark.sql.functions import *
columns_to_check = [ 'year', 'name' ]
n = 4
for c in columns_to_check:
# returns a dataframe
x = df.groupBy(c).count().sort(col("count").desc()).limit(n)
x.show()
# returns a list of rows
x = df.groupBy(c).count().sort(col("count").desc()).take(n)
print(x)
我不确定这是否能满足您的要求,但如果您可以使用单个数据帧,我认为它可以给您一个开始,否则请告诉我。您可以堆叠这3列或更多列,然后按groupby进行计数:
cols = ['year','name','sex']
e = f"""stack({len(cols)},{','.join(map(','.join,
(zip([f'"{i}"' for i in cols],cols))))}) as (col,val)"""
(df.select(*[F.col(i).cast('string') for i in cols]).selectExpr(e)
.groupBy(*['col','val']).agg(F.count("col").alias("Counts")).orderBy('col')).show()
+----+-------+------+
| col| val|Counts|
+----+-------+------+
|name| John| 2|
|name|William| 1|
| sex| boy| 3|
|year| 1881| 2|
|year| 1880| 1|
+----+-------+------+
如果你想要一个宽型,你也可以旋转,但我认为长型会很有帮助:
(df.select(*[F.col(i).cast('string') for i in cols]).selectExpr(e)
.groupBy('col').pivot('val').agg(F.count('val')).show())
+----+----+----+----+-------+----+
| col|1880|1881|John|William| boy|
+----+----+----+----+-------+----+
|name|null|null| 2| 1|null|
|year| 1| 2|null| null|null|
| sex|null|null|null| null| 3|
+----+----+----+----+-------+----+
thansk,但这能在没有“for”的情况下一次性完成吗?n次groupby似乎非常慢。如果您想在一条语句中执行分组/分区部分,您可以为每个列分区生成一个带有count的长SQL查询,然后针对每个列的不同结果为顶行编写n个查询。不确定它是否会更快。堆栈的智能使用