Python等价于dplyr';如果不是

Python等价于dplyr';如果不是,python,dfply,Python,Dfply,我正在将代码从R转换为Python,并在使用dfplysyntax/piping基于其他列修改新列方面寻求帮助 在本例中,如果col2为“c”,我想从col1中减去2,否则加4 import pandas as pd import numpy as np from dfply import * col1 = [1,2,3,4,5] col2 = ['a', 'b', 'c', 'd', 'e'] df = pd.DataFrame(data = {'col1': col1, 'col2':

我正在将代码从R转换为Python,并在使用
dfply
syntax/piping基于其他列修改新列方面寻求帮助

在本例中,如果
col2
为“c”,我想从
col1
中减去2,否则加4

import pandas as pd
import numpy as np
from dfply import *

col1 = [1,2,3,4,5]
col2 = ['a', 'b', 'c', 'd', 'e']

df = pd.DataFrame(data = {'col1': col1, 'col2': col2})
在R中,我会:

df_new <- df %>% 
  mutate(newCol = ifelse(col2 == 'c', col1 - 2, col1 + 4))
我得到一个错误“无效的数组结构”

请注意,这样做很好:

new_df = (df >>
    mutate(newCol = X.col1 - 2))

这里的python等价物是一个内联
if-else
表达式(或):

然后会变成

col1 - 2 if col2 == 'c' else col1 + 4

我将使用apply/lambda函数。X是数据帧行,axis=1表示每列应用lambda函数

df['newCol'] = df.apply(lambda X: X.col1 - 2 if X.col2 == 'c' else X.col1 + 4, axis=1)
df

  col1 col2 newCol
0   1   a   5
1   2   b   6
2   3   c   1
3   4   d   8
4   5   e   9

很简单,但是
new\u df=(df>>mutate(newCol=col1-2,如果col2='c'或者col1+4))
给了我一个错误“只能将列表(而不是“int”)连接到列表对不起,我写得有点太快了,我错过了找到好方法的时间。虽然新发布的答案可能更好。。。
col1 - 2 if col2 == 'c' else col1 + 4
df['newCol'] = df.apply(lambda X: X.col1 - 2 if X.col2 == 'c' else X.col1 + 4, axis=1)
df

  col1 col2 newCol
0   1   a   5
1   2   b   6
2   3   c   1
3   4   d   8
4   5   e   9