Как заменить значения в соответствии с непоследовательным списком индексов в фрейме данных pandas?

Я искал быстрый и эффективный способ замены значений в заданном столбце фрейма данных pandas, только если соответствующие индексы принадлежат списку непоследовательных чисел. Скажите non_consecutive_indices_list = [1400, 6571, 14526, 68420, ...] с ок. 30к разных значений.

  1. Я пытался использовать .iloc, но получаю сообщение об ошибке:

    df.iloc[non_consecutive_indices_list, 'column'] = New_Value
    

ValueError: может индексироваться только по местоположению с помощью [целочисленного, целочисленного среза (точка НАЧАЛА ВКЛЮЧЕНА, конечная точка ИСКЛЮЧЕНА), списка целых чисел, логического массива].

  1. В качестве альтернативы я пробовал следующее:

    df.iloc[non_consecutive_indices_list].column = New_Value
    

Но это возвращает копию исходного фрейма данных, поэтому я не могу заменить исходные значения.

  1. Наконец, я попытался использовать цикл for, который работает, но очень неэффективен и требует бесконечно, чтобы заменить около 30k значений:

    for i in non_consecutive_indices_list:
        df.loc[i, 'column'] = New_Value
    

Есть идеи, как это можно сделать самым быстрым способом?

А как насчет замены iloc на loc, например df.loc[non_consecutive_indices_list, 'column'] = New_Value?

jezrael 05.07.2018 09:53

Это странно, потому что в вашем случае есть «список целых чисел». Проверьте список, возможно, в нем есть нецелые значения.

CrazyElf 05.07.2018 09:58

Спасибо, Джезраэль! Вы только что сэкономили мне часы на будущие модификации!

R1fromBCN 05.07.2018 10:12
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
989
1

Ответы 1

Измените iloc на функцию DataFrame.loc:

df = pd.DataFrame({'column':list('abcdefghij')})

non_consecutive_indices_list = [2,4,1,6]
df.loc[non_consecutive_indices_list, 'column'] = 'New_Value'
print (df)
      column
0          a
1  New_Value
2  New_Value
3          d
4  New_Value
5          f
6  New_Value
7          h
8          i
9          j

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