我正在用PySpark DataFrames分析一些数据。假设我有一个正在聚合的数据帧< code>df:
(df.groupBy("group")
.agg({"money":"sum"})
.show(100)
)
这将给我:
group SUM(money#2L)
A 137461285853
B 172185566943
C 271179590646
聚合工作得很好,但我不喜欢新的列名SUM(Money#2L)
。有没有办法将此列重命名为人类可以从. agg
方法中读取的内容?也许更类似于dplyr
中的操作:
df %>% group_by(group) %>% summarise(sum_money = sum(money))
我为此做了一个小的辅助功能,可能会帮助一些人。
import re
from functools import partial
def rename_cols(agg_df, ignore_first_n=1):
"""changes the default spark aggregate names `avg(colname)`
to something a bit more useful. Pass an aggregated dataframe
and the number of aggregation columns to ignore.
"""
delimiters = "(", ")"
split_pattern = '|'.join(map(re.escape, delimiters))
splitter = partial(re.split, split_pattern)
split_agg = lambda x: '_'.join(splitter(x))[0:-ignore_first_n]
renamed = map(split_agg, agg_df.columns[ignore_first_n:])
renamed = zip(agg_df.columns[ignore_first_n:], renamed)
for old, new in renamed:
agg_df = agg_df.withColumnRenamed(old, new)
return agg_df
例如:
gb = (df.selectExpr("id", "rank", "rate", "price", "clicks")
.groupby("id")
.agg({"rank": "mean",
"*": "count",
"rate": "mean",
"price": "mean",
"clicks": "mean",
})
)
>>> gb.columns
['id',
'avg(rate)',
'count(1)',
'avg(price)',
'avg(rank)',
'avg(clicks)']
>>> rename_cols(gb).columns
['id',
'avg_rate',
'count_1',
'avg_price',
'avg_rank',
'avg_clicks']
至少做了一点,以避免人们打字太多。
< code>withColumnRenamed应该可以解决这个问题。下面是pyspark.sql API的链接。
df.groupBy("group")\
.agg({"money":"sum"})\
.withColumnRenamed("SUM(money)", "money")
.show(100)
虽然我仍然更喜欢dplyr语法,但这个代码片段可以做到:
import pyspark.sql.functions as sf
(df.groupBy("group")
.agg(sf.sum('money').alias('money'))
.show(100))
它变得冗长。
以下脚本: Floor1正在正确执行,Floor2使用相同的df执行,但使用重命名的列则不正确。我得到一个关键错误: 我知道,有一个类似的问题:重命名列后get keyerror 但我并没有真正得到答案,更重要的是,我没有找到解决办法。
我正在考虑将dataset1分解为每个“T”类型的多个记录,然后与DataSet2连接。但是你能给我一个更好的方法,如果数据集变大了,它不会影响性能吗?
我有麻烦重命名基于csv的数据帧的标头。 我得到了以下数据帧:df1: 现在我想根据csv文件更改列名(第一行),如下所示: 因此,我期望数据帧如下所示: 有什么想法吗?感谢您的帮助:)
我想将以下数据框的第1列重命名为“Ref”。我有很多列,因此无法重命名每个列或为每个列设置名称。 这是数据帧 现在我想将第一列重命名为'Ref'。我试过这个 它重命名所有标题与列[1]相似的列。
我有一个数据帧的值,如: 我想得到每个人不同行动的数量。这一点我可以通过
我有两个数据帧,DF1和DF2,DF1是存储来自DF2的任何附加信息的主机。 假设DF1是以下格式, DF2包含DF1中已经存在的2个条目和两个新条目。(itemId和item被视为一个组,可以被视为连接的键) 我需要合并两个数据框,以便增加现有项目计数并插入新项目。 结果应该是这样的: 我有一种方法可以做到这一点,但不确定这种方法是否有效或正确