Pandas группировать и сортировать по столбцам; необходимо добавить записи, разделенные запятыми - PullRequest
2 голосов
/ 18 июня 2020

у нас есть ниже Pandas Dataframe

enter image description here

Желаемый результат:

enter image description here

Я хочу создать группу столбцов, разделенных запятыми, по столбцу data и упорядочить по столбцу order

Я пробовал код ниже, но он заказывается сам по себе.

data= (df['section'].str.split(', ')
                    .groupby(df['data'])
                    .agg(lambda x: ', '.join(set(y for z in x for y in z)))
                    .reset_index())

1 Ответ

2 голосов
/ 18 июня 2020

Используйте DataFrame.sort_values перед groupby и, если нужен тот же порядок, что и оригинал, по столбцу data, добавьте DataFrame.reindex по уникальным значениям, созданным Series.unique :

df1 = (df.sort_values(['data','order'])
         .groupby('data')['section']
         .agg(','.join)
         .reindex(df['data'].unique())
         .reset_index())
print (df1)
        data                              section
0     google  code,reason,allergy,advance,service
1  Microsoft                          ab,ef,cd,gf

Если возможно, данные объединяются с помощью , сначала сортируются данные, а затем для уникальных значений используется словарь, поскольку наборы не имеют определенного порядка:

print (df)
        data     section  order
0     google  code, code      1
1     google     allergy      3
2     google      reason      2
3     google     service      5
4     google     advance      4
5  Microsoft  ab, ab, kl      1
6  Microsoft  eh, eh, cd      3
7  Microsoft          ef      2
8  Microsoft          gf      4


df1 = df.sort_values(['data','order'])

data= (df1['section'].str.split(', ')
                     .groupby(df['data'])
                     .agg(lambda x: ', '.join(dict.fromkeys(y for z in x for y in z).keys()))
                     .reindex(df['data'].unique())
                     .reset_index()
                    )
print (data)
        data                                  section
0     google  code, reason, allergy, advance, service
1  Microsoft                   ab, kl, ef, eh, cd, gf

Альтернатива для удаления дубликатов на DataFrame.explode на DataFrame.drop_duplicates:

df1 = df.sort_values(['data','order'])

data= (df1.assign(section= df1['section'].str.split(', '))
          .explode('section')
          .drop_duplicates(['data', 'section','order'])
          .groupby('data')['section']
          .agg(', '.join)
          .reindex(df['data'].unique())
          .reset_index()
                    )
print (data)
        data                                  section
0     google  code, reason, allergy, advance, service
1  Microsoft                   ab, kl, ef, eh, cd, gf
...