Сортировка строк фрейма данных

У меня есть следующий фрейм данных (adjusted_RFC_df):

     Node               Feature Indicator  Scaled     Class    Direction True_False
0       0                   km        <=   0.181   class_4      0 -> 1         NA
125   125                  gini         =   0.000   class_2    0 -> 126       FALSE
1       1                   WPS        <=   0.074   class_5      1 -> 2        TRUE
52     52                  gini         =   0.000   class_2     1 -> 53       FALSE
105   105                  gini         =   0.492   class_3  102 -> 106       FALSE
102   102           weird_words        <=   0.042   class_4  102 -> 103        TRUE
104   104                  gini         =   0.488   class_4  103 -> 105       FALSE
103   103              funktion        <=   0.290   class_4  103 -> 104        TRUE
107   107                  gini         =   0.000   class_5  106 -> 108       FALSE
106   106           Nb_of_verbs        <=   0.094   class_5  106 -> 107        TRUE
110   110                  gini         =   0.000   class_4  109 -> 111       FALSE
109   109                signal        <=   0.320   class_4  109 -> 110        TRUE
112   112          Flesch_Index        <=   0.627   class_1  112 -> 113        TRUE
115   115                  gini         =   0.000   class_3  112 -> 116       FALSE
114   114                  gini         =   0.000   class_1  113 -> 115       FALSE
113   113       Nb_of_auxiliary        <=   0.714   class_1  113 -> 114        TRUE
..    ...                   ...       ...     ...       ...          ...        ... 

Я пытаюсь отсортировать строки на основе значения в столбце «Направление» (0 -> 1, означает, что я пытаюсь отсортировать на основе первого числа 0). Я пытаюсь сделать это, используя:

   ## Sort rows based on first int of Direction column ##
   # create a column['key'] to sort df
   adjusted_RFC_df['key'] = Adjusted_RFC_df['Direction'].apply(lambda    x: x.split()[0])

   # Create new Dataframe with sorted values based on first number of 'Direction' col 
   class_determiner_df = Adjusted_RFC_df.sort_values('key')

Это работает при сортировке по первому значению перед «->» (слева), однако мне нужна сортировка, чтобы сохранить порядок с номером справа от «->»

Итак, это должно выглядеть так:

     Node               Feature Indicator  Scaled     Class    Direction True_False
0       0                   km        <=   0.181   class_4      0 -> 1         NA
125   125                  gini         =   0.000   class_2    0 -> 126       FALSE
1       1                   WPS        <=   0.074   class_5      1 -> 2        TRUE
52     52                  gini         =   0.000   class_2     1 -> 53       FALSE
105   105           weird_words         =   0.492   class_3  102 -> 103       FALSE
102   102                  gini        <=   0.042   class_4  102 -> 103        TRUE
104   104              funktion         =   0.488   class_4  103 -> 104       FALSE
103   103                  gini        <=   0.290   class_4  103 -> 105        TRUE
107   107           Nb_of_verbs         =   0.000   class_5  106 -> 107       FALSE
106   106                  gini        <=   0.094   class_5  106 -> 108        TRUE
110   110                signal         =   0.000   class_4  109 -> 110       FALSE
109   109                  gini        <=   0.320   class_4  109 -> 111        TRUE
112   112          Flesch_Index        <=   0.627   class_1  112 -> 113        TRUE
115   115                  gini         =   0.000   class_3  112 -> 116       FALSE
114   114        Nb_of_auxiliary        =   0.000   class_1  113 -> 114       FALSE
113   113                  gini        <=   0.714   class_1  113 -> 115        TRUE
..    ...                   ...       ...     ...       ...          ...        ... 

Это сбивает меня с толку, так как иногда он сохраняет порядок между правыми числами, но в большинстве случаев это не так.

Я подумал, что, возможно, это проблема с сортировкой строк, поскольку направление col имеет тип string. Итак, я попытался сделать следующее:

adjusted_RFC_df['key'] = adjusted_RFC_df['key'].astype(np.int64)

Однако это вызывает следующую ошибку:

ValueError: invalid literal for int() with base 10: 'NA'

Таким образом, кажется, что он пытается преобразовать столбец ['TRUE/FALSE'] в int, а также просто столбец ['key'].

Вероятно, проблема в том, что столбец Direction является строкой типа?

Или есть способ сортировки на основе первого числа перед '->', при этом гарантируя, что второе число также находится в порядке (отсортировано от меньшего к большему)?

для ValueError: invalid literal for int() with base 10: 'NA', вы уверены, что в 'NA' нет значений adjusted_RFC_df['key']? Попробуйте запустить (adjusted_RFC_df['key'] == 'NA').sum() и убедитесь, что это ноль. Или еще лучше, adjusted_RFC_df['Direction'].str.contains('NA').sum()

Ken Wei 27.05.2019 11:48

и для вашей проблемы, что иногда он сохраняет порядок, а иногда нет, это происходит из-за того, что он сортирует на основе ключа и сохраняет тот же порядок в исходном фрейме данных между элементами, которые имеют один и тот же ключ

ichafai 27.05.2019 11:53

@KenWei, да, он содержит NA, мне нужно, чтобы последнее направление было NA, поскольку для последнего элемента нет возможного значения. Хотя спасибо за подсказку

codiearcher 27.05.2019 13:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если Direction всегда имеет тип string, а также имеет такой формат int space '->' space int, как 1 -> 2, то вы можете получить другой ключ к сортировке

df['key1'] = df['Direction'].apply(lambda x: x.split()[0])
df['key2'] = df['Direction'].apply(lambda x: x.split()[2])

а затем сортировать на основе этих двух ключей

df.sort_values(['key1', 'key2'])

редактировать: Вот еще один способ получить key1 и «key2»

df['key1'] = df['Direction'].apply(lambda x: int(x.split('->')[0]))
df['key2'] = df['Direction'].apply(lambda x: int(x.split('->')[1]))

Спасибо, я попробую это

codiearcher 27.05.2019 11:48

Хорошо, дайте нам знать, если это не сработает, это означает, что столбец «Направление» не всегда имеет один и тот же формат, перед этим потребуется некоторая простая предварительная обработка.

ichafai 27.05.2019 11:49

где вылетает? при вычислении key2 ? или на сортировке?

ichafai 27.05.2019 11:53

На сортировке. Это потому, что у меня есть «NA» в моем списке направлений, поэтому формат не идентичен повсюду из-за этого одного элемента, однако у меня нет ничего другого, чтобы заменить его.

codiearcher 27.05.2019 11:55

или у вас нет места, потому что, когда мы пытаемся получить key1 и key2, когда разбиваем строку и получаем список элементов (разделенных по пробелу) и пытаемся получить List[0] и List[2]. Если в разделении на самом деле нет 3 элементов, нормально вывести список за пределы. Я предложу вам предварительную обработку, возможно, это поможет. Вам нужны строки, где направление Нан?

ichafai 27.05.2019 11:57

Спасибо, да, я вижу, что это должно работать, как только я немного лучше организовал свой фрейм данных.

codiearcher 27.05.2019 12:14

На самом деле, когда я просматриваю первую сотню или около того строк фрейма данных, кажется, что он работает, однако, когда я теперь смотрю на каждую строку, оказывается, что он не работает. Есть еще много строк, в которых второе число (справа от '->') не упорядочено правильно. Я убедился, что теперь у меня есть только все элементы с одинаковым форматом.

codiearcher 27.05.2019 16:41

Не могли бы вы привести несколько примеров, когда это не работает? иногда просто пробел может все испортить. Я посмотрю, где это не работает, и дам несколько строк, которые будут предварительно обработаны и, надеюсь, сработают.

ichafai 27.05.2019 16:44

редактировать: я добавил еще один способ получить key1 и key2, попробуйте их тоже, если он все еще не работает, мне понадобятся примеры, где это не так, чтобы понять проблему.

ichafai 27.05.2019 16:50

Другие вопросы по теме