У меня есть таблица с 150 000 строк и 15 столбцов. Важными столбцами для этого примера являются COUNTRY, COSTCENTER и EXTENSION. Я читаю из CSV в Pandas Dataframe. Все столбцы имеют тип объекта.Нужно фильтровать по нескольким столбцам и изменять значение одного в Python Pandas
То, что я хочу сделать, это:
- Поиск определенной страны (например, «Китай»)
- Фильтр для этих случаев, когда COSTCENTER является либо 1000 или 2000 или где РАСШИРЕНИЕ начинается с " 862 "
- После того, как все фильтры были применены, измените название страны в COUNTRY на что-то новое.
У меня было решение, но я всегда получал предупреждение для выпуска цепным:
df.COUNTRY[df.COUNTRY.str.match("China") &
(df.COSTCENTER.str.match("1000") |
df.COSTCENTER.str.match("2000"))] = 'China_new_name'
Я не могу сказать, я полностью понял, почему я мог бы иметь проблемы, но я искал альтернатива. Я пытался использовать лямбда и применять, но я все время получал всевозможные ошибки.
Мой последний подход в настоящее время был:
filter_China = df.ix[(df["COUNTRY"]=="China") &
((df["COSTCENTER"]=="1000") | (df["COSTCENTER"]=="2000"))]
и, кажется, процедить, что я ищу (я не включил поиск по РАСПРОСТРАНЕНИЕ еще, как я первый хотел, чтобы это работало).
Но когда я пытаюсь изменить значение, на основе моих критериев поиска, я бег в неприятность:
df.ix[(df["COUNTRY"]=="China") & ((df["COSTCENTER"]=="1000") |
(df["COSTCENTER"]=="2000")), df["COUNTRY"]] = "China_new_name"
Я получаю эту ошибку: поднять исключение KeyError («% S не в индексе»% objarr [маска])
Что мне здесь не хватает? Является ли подход правильным или мне нужно идти по другому пути?
Спасибо за ваш ответ. Я читал документацию, но мои знания о Python/Pandas все еще слишком низки, чтобы понять это полностью. Просто началось пару недель назад ... Не могли бы вы дать мне понять, почему вы изменили с df ["COUNTRY] ==" Китай "на str.match? И в целом, это правильный подход (например, скорость 44). – SLglider
Я думаю, что 'str.match' не является необходимым. См. мой ответ. – jezrael
Также он медленнее, сравнивается с вашей функцией без' str.startswith', а также медленнее. – jezrael