У меня есть следующий фрейм данных (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 является строкой типа?
Или есть способ сортировки на основе первого числа перед '->', при этом гарантируя, что второе число также находится в порядке (отсортировано от меньшего к большему)?
и для вашей проблемы, что иногда он сохраняет порядок, а иногда нет, это происходит из-за того, что он сортирует на основе ключа и сохраняет тот же порядок в исходном фрейме данных между элементами, которые имеют один и тот же ключ
@KenWei, да, он содержит NA, мне нужно, чтобы последнее направление было NA, поскольку для последнего элемента нет возможного значения. Хотя спасибо за подсказку
Если 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]))
Спасибо, я попробую это
Хорошо, дайте нам знать, если это не сработает, это означает, что столбец «Направление» не всегда имеет один и тот же формат, перед этим потребуется некоторая простая предварительная обработка.
где вылетает? при вычислении key2 ? или на сортировке?
На сортировке. Это потому, что у меня есть «NA» в моем списке направлений, поэтому формат не идентичен повсюду из-за этого одного элемента, однако у меня нет ничего другого, чтобы заменить его.
или у вас нет места, потому что, когда мы пытаемся получить key1 и key2, когда разбиваем строку и получаем список элементов (разделенных по пробелу) и пытаемся получить List[0] и List[2]. Если в разделении на самом деле нет 3 элементов, нормально вывести список за пределы. Я предложу вам предварительную обработку, возможно, это поможет. Вам нужны строки, где направление Нан?
Спасибо, да, я вижу, что это должно работать, как только я немного лучше организовал свой фрейм данных.
На самом деле, когда я просматриваю первую сотню или около того строк фрейма данных, кажется, что он работает, однако, когда я теперь смотрю на каждую строку, оказывается, что он не работает. Есть еще много строк, в которых второе число (справа от '->') не упорядочено правильно. Я убедился, что теперь у меня есть только все элементы с одинаковым форматом.
Не могли бы вы привести несколько примеров, когда это не работает? иногда просто пробел может все испортить. Я посмотрю, где это не работает, и дам несколько строк, которые будут предварительно обработаны и, надеюсь, сработают.
редактировать: я добавил еще один способ получить key1 и key2, попробуйте их тоже, если он все еще не работает, мне понадобятся примеры, где это не так, чтобы понять проблему.
для
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()