Есть ли какой-либо способ сортировки столбца фрейма данных, содержащего списки?

#python #pandas #data-science

#питон #панды #наука о данных

Вопрос:

У меня есть столбец во фрейме данных, который содержит данные списка

например:

 enter code here | Column 1 | Column 2 | |--------- |---------------------------| | 1 | ['jan'] | | 2 | ['jan','feb'] | | 3 | ['feb','jan'] | | 4 | ['mar','april','jan'] | | 5 | ['jan','mar','april'] | | 6 | ['jan','feb','mar'] | | 7 | ['jan','feb','mar'] |  

Как и в приведенной выше таблице, мы видим, что столбец 2, строка 2 и строка 3 имеют один и тот же список с разным порядком. то же самое относится и к другим значениям. например (строка 4 и строка 5)

Я должен сортировать в таком порядке

 enter code here ['oct' ,'nov' ,'dec' ,'jan' ,'feb' ,'march' ,'april']  

Желаемый результат должен быть таким, как показано ниже, новый столбец 3 с отсортированными значениями

 enter code here | Column 1 | Column 2 | Column 3 | |--------- |---------------------------|---------------------------| | 1 | ['oct'] | ['oct'] | | 2 | ['oct','nov'] | ['oct','nov'] | | 3 | ['nov','oct'] | ['oct','nov'] | | 4 | ['mar','april','jan'] | ['jan','mar','april'] | | 5 | ['jan','mar','april'] | ['jan','mar','april'] | | 6 | ['jan','feb','mar'] | ['jan','feb','mar'] | | 7 | ['jan','feb','mar'] | ['jan','feb','mar'] |  

Ответ №1:

Использование sorted путем создания словаря с enumerate :

 #import ast  #converted to lists if necessary df['Column 2'] = df['Column 2'].apply(ast.literal_eval)  months = ['oct' ,'nov' ,'dec' ,'jan' ,'feb' ,'mar' ,'april']  d = {v: k for k, v in enumerate(months)}   df['Column 2'] = df['Column 2'].apply(lambda x: sorted(x, key=lambda y: d[y])) print (df)  Column 1 Column 2 0 1 [jan] 1 2 [jan, feb] 2 3 [jan, feb] 3 4 [jan, mar, april] 4 5 [jan, mar, april] 5 6 [jan, feb, mar] 6 7 [jan, feb, mar]  

Если значения являются первыми 3 буквами, возможна сортировка по датам:

 df['Column 2'] = df['Column 2'].apply(lambda x: sorted(x, key=lambda y: pd.to_datetime(y, format='%b'))) print (df)  Column 1 Column 2 0 1 [jan] 1 2 [jan, feb] 2 3 [jan, feb] 3 4 [jan, mar, apr] 4 5 [jan, mar, apr] 5 6 [jan, feb, mar] 6 7 [jan, feb, mar]  

Комментарии:

1. Спасибо за отзыв @jezrael. Первый метод работает, но почему он не хэшируется и что здесь делает «ast». И во втором случае, поскольку у нас нет информации о годе, как это может привести к октябрю, ноябрю и декабрю до января месяца. Октябрь, ноябрь и декабрь — это месяцы предыдущего года. И после этого наступает январь, февраль.