让我们说我有这个数据框。
df
line to_line priority 10 20 1 10 30 1 50 40 3 60 70 2 50 80 3
基于 line 和 priority 列值(当它们相同或重复时,如上所示),我想合并 to_line 价值观。 提议的结果应如下所示。
line to_line priority 10 20/30 1 50 40/80 3 60 70 2
我尝试了类似的方法,但是我无法得到想要的东西。
df.groupBy(col("line")).agg(collect_list(col("to_line")) as "to_line").withColumn("to_line", concat_ws(",", col("to_line")))
您能帮忙弄清楚吗?感谢您的投入和时间。
答案 0 :(得分:4)
您可以通过自定义聚合功能来实现。
代码
df = pd.DataFrame({
'line': [10,10,50,60,50],
'to_line': [20,30,40,70,80],
'priority': [1,1,3,2,3]
})
array_agg = lambda x: '/'.join(x.astype(str))
grp_df = df.groupby(['line', 'priority']).agg({'to_line': array_agg})
,或者如果您不想将分组的列作为索引,则可以将as_index
参数传递给groupby
方法
grp_df = df.groupby(['line', 'priority'], as_index=False).agg({'to_line': array_agg})
输出
to_line
line priority
10 1 20/30
50 3 40/80
60 2 70
答案 1 :(得分:1)
也许是这样的:
res = []
df.to_line = df.to_line.astype(str)
for line_priority, df_chunk in df.groupby(['line','priority']):
df_chunk = df_chunk.reset_index().sort_values('to_line')
to_line = "/".join(df_chunk.to_line.values)
res.append({'to_line':to_line,'priority':line_priority[1],'line':line_priority[0]})
pd.DataFrame(res)
答案 2 :(得分:1)
您可以使用
0
输出
df.groupby(['line','priority'])['to_line'].apply(lambda x: '/'.join(str(y) for y in x)).reset_index(name='to_line')