pandas replace_if использует цепочки

#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"]))
)