pd.dataframe — сортировка каждого списка в столбце списков без изменения индекса

#python #pandas #list #sorting #indexing

#питон #панды #Список #сортировка #индексация

Вопрос:

Если у меня есть эта панда v1.3.4 dataframe :

 index col1 col2  1 ['1','2','3'] 'a'  2 ['2','4','2'] 'b'  3 ['5','2','1'] 'c'  4 ['3','2','1'] 'd'  

Как я могу отсортировать каждое значение col1 без изменения index или каких-либо других значений (в данном случае col2)? Для этого примера, если я отсортирую от самого низкого до самого высокого (при условии, что лексиографическая сортировка соответствует числовой сортировке) Я бы получил:

 index col1 col2  1 ['1','2','3'] 'a'  2 ['2','2','4'] 'b'  3 ['1','2','5'] 'c'  4 ['1','2','3'] 'd'  

Мне не особенно важно, какой подход к сортировке я использую, я просто хочу, чтобы списки с одинаковыми элементами имели одинаковый порядок, чтобы они были признаны эквивалентными для некоторой последующей визуализации данных.

Спасибо!

Тим

Ответ №1:

В случае , если вы не хотите использовать какой-либо импорт (кроме pandas , конечно):

 import pandas as pd df = pd.DataFrame({'col1': [['1', '2', '20'], ['2', '10', '2'], ['30', '2', '1'], ['3', '2', '1']]})  

Вы можете отсортировать каждый список численно, используя:

 df[['col1']].apply(lambda x: sorted(map(int,x["col1"])), axis=1)  

выход

 0 [1, 2, 20] 1 [2, 2, 10] 2 [1, 2, 30] 3 [1, 2, 3]  

Или в виде строк с использованием:

 df[['col1']].apply(lambda x: sorted(map(str,x["col1"])), axis=1)  

выход

 0 [1, 2, 20] 1 [10, 2, 2] 2 [1, 2, 30] 3 [1, 2, 3]  

Ответ №2:

Если вы хотите отсортировать строковые представления целых чисел, используйте natsort :

 from natsort import natsorted df['col1'] = df['col1'].apply(natsorted)  

выход:

 index col1 col2 0 1 ['1', '2', '3'] 'a' 1 2 ['2', '2', '4'] 'b' 2 3 ['1', '2', '5'] 'c' 3 4 ['1', '2', '3'] 'd'  

Ответ №3:

Вы можете преобразовать свой столбец в список с ast.literal_eval помощью if col1 -строки, а затем отсортировать его с помощью apply :

 import ast df.col1 = df.col1.apply(lambda x: sorted(ast.literal_eval(x))) print(df)  

Выход:

 col1 col2 index 1 [1, 2, 3] 'a' 2 [2, 2, 4] 'b' 3 [1, 2, 5] 'c' 4 [1, 2, 3] 'd'  

Ответ №4:

Или понимание старого доброго списка.

 df['col1'] = [sorted(i) for i in df.col1]  

Пример использования iris :

 iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') iris['test'] = iris[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values.tolist() iris['test2'] = [sorted(i) for i in iris.test]