Я пытаюсь перепрограммировать свой код Stata на Python для повышения скорости, и меня указали в сторону PANDAS. Однако мне трудно понять, как обрабатывать данные.
Допустим, я хочу перебрать все значения в заголовке столбца «ID». Если этот идентификатор соответствует определенному числу, я хочу изменить два соответствующих значения FirstName и LastName.
В Stata это выглядит так:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Таким образом, это заменяет все значения в FirstName, которые соответствуют значениям ID == 103 на Matt.
В PANDAS я пробую что-то вроде этого
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
Не уверен, куда идти дальше. Любые идеи?
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
Вы можете использовать
map
, он может отображать значения из молочного склада или даже настраиваемую функцию.Предположим, это ваш df:
Создайте dicts:
И карта:
Результат будет:
Или используйте настраиваемую функцию:
источник
dict
он создан для отображения. В противном случае можно выполнить некоторую проверку / очистку на основе чего-то вроде:df.ID.isin(names.keys())
Исходный вопрос касается конкретного узкого варианта использования. Для тех, кому нужны более общие ответы, вот несколько примеров:
Создание нового столбца с использованием данных из других столбцов
Учитывая приведенный ниже фрейм данных:
Ниже мы добавляем новый
description
столбец как объединение других столбцов, используя+
операцию, которая переопределяется для серий. Причудливое форматирование строк, f-строки и т. Д. Здесь не будут работать, поскольку+
применяется к скалярам, а не к «примитивным» значениям:Мы получаем
1 years
для кота (вместо1 year
), который мы будем исправлять ниже с помощью условных выражений.Изменение существующего столбца с помощью условных выражений
Здесь мы заменяем исходный
animal
столбец значениями из других столбцов и используемnp.where
для установки условной подстроки на основе значенияage
:Изменение нескольких столбцов с помощью условных выражений
Более гибкий подход - вызвать
.apply()
весь фрейм данных, а не один столбец:В приведенном выше коде
transform_row(r)
функция принимаетSeries
объект, представляющий заданную строку (обозначенное значкомaxis=1
, значение по умолчаниюaxis=0
предоставитSeries
объект для каждого столбца). Это упрощает обработку, поскольку мы можем получить доступ к фактическим «примитивным» значениям в строке, используя имена столбцов, и иметь видимость других ячеек в данной строке / столбце.источник
np.where
вероятно, это то, что вы ищете, см., Например, stackoverflow.com/a/42540310/191246, но также возможно, что вы не сможете вписать логику в скалярную операцию, тогда вам нужно будет явно преобразовать ячейка численно похожа на то, как это делается вtransform_row
Этот вопрос все еще можно посещать достаточно часто, поэтому стоит предложить дополнение к ответу г-на Кэссиса.
dict
Встроенный класс может быть суб-классифицироваться таким образом , что по умолчанию возвращается для ключей «пропавших без вести». Этот механизм хорошо работает для панд. Но смотрите ниже.Таким образом можно избежать ключевых ошибок.
То же самое можно сделать проще следующим образом. Использование аргумента default для
get
метода объекта dict делает ненужным создание подкласса dict.источник