根据熊猫数据框中的其他列值组合列值

时间:2019-10-17 14:32:24

标签: python pandas dataframe

让我们说我有这个数据框。

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")))

您能帮忙弄清楚吗?感谢您的投入和时间。

3 个答案:

答案 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')