Проблема при сортировке строк фрейма данных и изменении значений каждой второй строки

Я работаю над фреймворком данных, пытаясь сначала отсортировать его по значениям столбца. Затем измените значение каждой второй строки определенных столбцов. Чтобы отсортировать столбцы, которые я делаю:

df['key'] = df['Direction'].apply(lambda x: x.split()[0])
# Take the second number to ensure the order is kept
df['key2'] = df['Direction'].apply(lambda x: x.split()[2])

class_determiner_df = df.sort_values(['key', 'key2'])

Это работает при сортировке столбцов, как и ожидалось, из моего предыдущего вопроса здесь Сортировка строк фрейма данных.

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

         Node               Feature Indicator  Scaled     Class    Direction
    0       0                    km        <=   0.181   class_4      0 -> 1 
    201   201                  gini         =   0.000   class_5    0 -> 202 
    1       1                   WPS        <=   0.074   class_5      1 -> 2 
    64     64                  gini         =   0.000   class_4     1 -> 65 
    10     10              funktion        <=   0.500   class_2    10 -> 11 
    17     17                  gini         =   0.000   class_5    10 -> 18 
    100   100                   SPW        <=   0.282   class_5  100 -> 101 
    101   101                  gini         =   0.000   class_5  100 -> 102 
    102   102              words_nb        <=   0.322   class_3  102 -> 103 
    123   123                  gini         =   0.496   class_2  102 -> 124 
    103   103              words_nb        <=   0.125   class_2  103 -> 104 
    104   104                  gini         =   0.000   class_2  103 -> 105 
    105   105                   SPW        <=   0.290   class_4  105 -> 106 
    106   106                  gini         =   0.000   class_4  105 -> 107 
    107   107              words_nb        <=   0.197   class_3  107 -> 108 
    116   116                  gini         =   0.000   class_4  107 -> 117 
    108   108                   SPW        <=   0.330   class_3  108 -> 109 
    109   109                  gini         =   0.000   class_3  108 -> 110 
    11     11           auftragnehm        <=   0.500   class_2    11 -> 12 
    16     16                  gini         =   0.000   class_2    11 -> 17 
    110   110             Comp_conj        <=   0.125   class_3  110 -> 111 
    115   115                  gini         =   0.000   class_4  110 -> 116 
    111   111              words_nb        <=   0.138   class_3  111 -> 112 
    112   112                  gini         =   0.000   class_3  111 -> 113 
    113   113           weird_words        <=   0.167   class_3  113 -> 114 
    114   114                  gini         =   0.000   class_3  113 -> 115 
    117   117              polarity        <=   0.175   class_2  117 -> 118 
    118   118                  gini         =   0.000   class_2  117 -> 119 
    119   119          Aux_Start_no        <=   0.500   class_3  119 -> 120 
    120   120                  gini         =   0.000   class_3  119 -> 121 
    ..    ...                   ...       ...     ...       ...          ...

Затем я пытаюсь сделать каждую вторую строку для df['feature'] и df['value'] равной строке выше, а df['indicator'] равной '>'

Для этого я использую следующее, взятое из этого ответа: Отрегулируйте каждую вторую строку фрейма данных

 # Adjust every other row
class_determiner_df.loc[1::2, 'Feature'] = None
class_determiner_df.loc[1::2, 'Scaled'] = None
class_determiner_df.loc[1::2, 'Indicator'] = '>'
# fillna() method of DataFrame scans rows from top, and when it finds a python None value (equivalent to numpy.NaN) 
# it replaces the None value with the last significant value from the same column
class_determiner_df.fillna(method='ffill', inplace=True)

Это создает следующий неверный фрейм данных:


         Node             Feature Indicator  Scaled     Class    Direction
    0       0                  km        <=   0.181   class_4      0 -> 1 
    201   201                gini         =   0.000   class_5    0 -> 202 
    1       1                gini         >   0.000   class_5      1 -> 2 
    64     64                gini         =   0.000   class_4     1 -> 65 
    10     10                gini         >   0.000   class_2    10 -> 11 
    17     17                gini         =   0.000   class_5    10 -> 18 
    100   100                gini         >   0.000   class_5  100 -> 101 
    101   101                gini         =   0.000   class_5  100 -> 102 
    102   102                gini         >   0.000   class_3  102 -> 103 
    123   123                gini         =   0.496   class_2  102 -> 124 
    103   103                gini         >   0.496   class_2  103 -> 104 
    104   104                gini         =   0.000   class_2  103 -> 105 
    105   105                gini         >   0.000   class_4  105 -> 106 
    106   106                gini         =   0.000   class_4  105 -> 107 
    107   107                gini         >   0.000   class_3  107 -> 108 
    116   116                gini         =   0.000   class_4  107 -> 117 
    108   108                gini         >   0.000   class_3  108 -> 109 
    109   109                gini         =   0.000   class_3  108 -> 110 
    11     11                gini         >   0.000   class_2    11 -> 12 
    16     16                gini         =   0.000   class_2    11 -> 17 
    110   110                gini         >   0.000   class_3  110 -> 111 
    115   115                gini         =   0.000   class_4  110 -> 116 
    111   111                gini         >   0.000   class_3  111 -> 112 
    112   112                gini         =   0.000   class_3  111 -> 113 
    113   113                gini         >   0.000   class_3  113 -> 114 
    114   114                gini         =   0.000   class_3  113 -> 115 
    117   117                gini         >   0.000   class_2  117 -> 118 
    118   118                gini         =   0.000   class_2  117 -> 119 
    119   119                gini         >   0.000   class_3  119 -> 120 
    120   120                gini         =   0.000   class_3  119 -> 121 
    ..    ...                 ...       ...     ...       ...          ...

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

        Node               Feature Indicator  Scaled     Class    Direction
    0       0                    km        <=   0.181   class_4      0 -> 1 
    201   201                    km         >   0.181   class_5    0 -> 202 
    1       1                   WPS        <=   0.074   class_5      1 -> 2 
    64     64                   WPS         >   0.074   class_4     1 -> 65 
    10     10              funktion        <=   0.500   class_2    10 -> 11 
    17     17              function         >   0.500   class_5    10 -> 18 
    100   100                   SPW        <=   0.282   class_5  100 -> 101 
    101   101                   SPW         >   0.282   class_5  100 -> 102 
    102   102              words_nb        <=   0.322   class_3  102 -> 103 
    123   123              words_nb         >   0.322   class_2  102 -> 124 
    105   105                   SPW        <=   0.290   class_4  105 -> 106 
    106   106                   SPW         >   0.290   class_4  105 -> 107 
    ...

Я не совсем уверен, почему следующее не работает, поскольку мне кажется, что это то, что мне нужно

    class_determiner_df.loc[1::2, 'Feature'] = None
    class_determiner_df.loc[1::2, 'Scaled'] = None
    class_determiner_df.loc[1::2, 'Indicator'] = '>'
    # fillna() method of DataFrame scans rows from top, and when it finds a python None value (equivalent to numpy.NaN) 
    # it replaces the None value with the last significant value from the same column
    class_determiner_df.fillna(method='ffill', inplace=True)

Попробуйте class_determiner_df.reset_index(inplace=True, drop=True) перед корректировкой каждой второй строки

Chris Adams 27.05.2019 14:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это потому, что loc использует метку индекса, а не позиция. Вы можете использовать DataFrame.reset_index, чтобы легко это исправить:

class_determiner_df.reset_index(inplace=True, drop=True)

# Adjust every other row
class_determiner_df.loc[1::2, 'Feature'] = None
class_determiner_df.loc[1::2, 'Scaled'] = None
class_determiner_df.loc[1::2, 'Indicator'] = '>'
# fillna() method of DataFrame scans rows from top, and when it finds a python None value (equivalent to numpy.NaN) 
# it replaces the None value with the last significant value from the same column
class_determiner_df.fillna(method='ffill', inplace=True)

Спасибо за объяснение

codiearcher 27.05.2019 15:10

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