#python #r #pandas #dplyr
#питон #r #pandas #dplyr #python
Вопрос:
Я пытаюсь написать dplyr/magrittr
подобную цепную операцию в pandas, где один шаг включает в себя команду replace if.
в R это было бы:
mtcars %>%
mutate(mpg=replace(mpg, cyl==4, -99)) %>%
as.data.frame()
в python я могу сделать следующее:
data = pd.read_csv('https://gist.githubusercontent.com/ZeccaLehn/4e06d2575eb9589dbe8c365d61cb056c/raw/64f1660f38ef523b2a1a13be77b002b98665cdfe/mtcars.csv')
.rename(columns={'Unnamed: 0':'brand'}, inplace=True)
data.loc[df.cyl == 4, 'mpg'] = -99
но я бы предпочел, если бы это могло быть частью цепочки. Я не смог найти никакой replace
альтернативы для pandas, что меня озадачивает. Я ищу что-то вроде:
data = pd.read_csv('https://gist.githubusercontent.com/ZeccaLehn/4e06d2575eb9589dbe8c365d61cb056c/raw/64f1660f38ef523b2a1a13be77b002b98665cdfe/mtcars.csv')
.rename(columns={'Unnamed: 0':'brand'}, inplace=True)
.replace_if(...)
Комментарии:
1. использует
Series.where
илиnumpy.where
сDataFrame.assign
2. кроме того, не используйте
inplace=True
в цепочке.3. Как
where
илиassign
будет работать здесь с цепочкой? Поскольку чтение происходит при одной и той же операции, трудно ссылаться на то, что вам нужно. В этой ситуации я думаю, что цепочка want to усложняет эту операцию гораздо больше, чем ее разделение.4. @ALollz с
lambda
..? И используетmask
. Цепочка на подобном.assign(mpg = lambda x: x['mpg'].mask(x['cyl'] == 4, -99))
5. или еще проще
.assign(mpg = lambda x: np.where(x.cyl == 4,-99 , x.mpg ))
Ответ №1:
Довольно просто сделать в цепочке. Убедитесь, что вы не используете inplace=
в цепочке, поскольку это не возвращает фрейм данных следующему элементу в цепочке
(pd.read_csv('https://gist.githubusercontent.com/ZeccaLehn/4e06d2575eb9589dbe8c365d61cb056c/raw/64f1660f38ef523b2a1a13be77b002b98665cdfe/mtcars.csv')
.rename(columns={'Unnamed: 0':'brand'})
.assign(mpg=lambda dfa: np.where(dfa["cyl"]==4, -99, dfa["mpg"]))
)