Сортировать строки фрейма данных - PullRequest
2 голосов
/ 27 мая 2019

У меня есть следующий фрейм данных (отрегулированный_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 является строкой типа?

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

1 Ответ

2 голосов
/ 27 мая 2019

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