我有如下示例输入dataframe,但是值(clm以m开头)列可以是n number。
customer_id|month_id|m1 |m2 |m3 .......m_n
1001 | 01 |10 |20
1002 | 01 |20 |30
1003 | 01 |30 |40
1001 | 02 |40 |50
1002 | 02 |50 |60
1003 | 02 |60 |70
1001 | 03 |70 |80
1002 | 03 |80 |90
1003 | 03 |90 |100
现在,我必须在每个月分组的基础上创建基于累积和的新列。因此,我使用了窗口函数。因为,我将有n个列,而不是带有for循环的withcolumn,所以我需要动态创建一个查询或列表,并将其传递给selectexpr来计算新的列。
例如:
rownum_window = (Window.partitionBy("partner_id").orderBy("month_id").rangeBetween(Window.unboundedPreceding, 0))
df = df.select("*", F.sum(col("m1")).over(rownum_window).alias("n1"))
但是,我想准备一个动态表达式,然后需要传递给dataframe select。我该怎么做?
LIKE: expr = ["F.sum(col("m1")).over(rownum_window).alias("n1")", "F.sum(col("m2")).over(rownum_window).alias("n2")", "F.sum(col("m3")).over(rownum_window).alias("n3")", .......]
df = df.select("*', expr)
或者其他任何dataframe select方法,我可以创建select表达式吗?
输出:
customer_id|month_id|m1 |m2 |n1 |n2
1001 | 01 |10 |20 |10 |20
1002 | 01 |20 |30 |20 |30
1003 | 01 |30 |40 |30 |40
1001 | 02 |40 |50 |50 |70
1002 | 02 |50 |60 |70 |90
1003 | 02 |60 |70 |90 |110
1001 | 03 |70 |80 |120 |150
1002 | 03 |80 |90 |150 |180
1003 | 03 |90 |100 |180 |210
2条答案
按热度按时间xqnpmsa81#
对@lamanus建议稍加修改,下面的代码可能有助于解决您的问题,
xpcnnkqh2#
更新时间:
试试这个。