Объедините значения столбцов на основе других значений столбцов во фрейме данных Pandas - PullRequest
0 голосов
/ 17 октября 2019

Допустим, у меня есть этот фрейм данных.

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 ]

4 голосов
/ 17 октября 2019

Этого можно добиться с помощью пользовательской функции агрегирования.

Код

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 голос
/ 17 октября 2019

Вы можете использовать

df.groupby(['line','priority'])['to_line'].apply(lambda x: '/'.join(str(y) for y in x)).reset_index(name='to_line')

выход

  line  priority    to_line
0   10        1     20/30
1   50        3     40/80
2   60        2     70

1 голос
/ 17 октября 2019

Может быть, что-то вроде этого:

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)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...