将 R 条件跨两列转换为 Python

Translating R mutate conditional across two columns to Python

我正在将 R 中的某些内容翻译成 Python 并且无法理解如何跨两列实现条件变异函数以实现 Python.

中的类似内容
df <- df %>%
    select(col_1,…,col_n) %>%
    mutate(new_col = ifelse(is.na(col_1), NA, 2),
           new_col = ifelse(is.na(col_2), new_col, ifelse(col_3 == 1, new_col+1, new_col-1))).

到目前为止,我有以下内容,其中 col_1 是一个字符串,col_2 是一个字符串,col_3 是一个浮点数:

df = df[[col_1,...,col_n]]
df[new_col] = df[col_1].apply(lambda x: np.nan if x is np.nan else 2)

并且不知道如何进行下一次变异。我尝试了以下方法:

1. df[new_col] = df.apply[col_2](lambda x: x if x is ' ' else df[col_3].apply(lambda x: x+1 if x == 1 else x-1) 
# This timesout the kernel


2. df[new_col] = df.apply(lambda x: x if x[col_2] == ' ' else x+1 if x[col_3] == 1 else x-1 if x[col_3] != else x)
# This results in an error of unsuporrted operand type(s) for -: 'str' and 'int'
# I also don't think the 'else x' at the end is the correct way to get the same result

有没有一种方法可以通过比嵌套应用的计算成本更低的方法(如果这甚至是一种正确的攻击方法)或某种方法来手动提取必要的信息?

我想“直译”应该是这样的:

df = df[[col_1,...,col_n]]
df['new_col'] = np.where(df['col_1'].isnull(), 
                         np.nan, 
                         2)
df['new_col'] = np.where(df['col_2'].isnull(), 
                         df['new_col'], 
                         np.where(df['col_3'] == 1, 
                                  df['new_col']+1, 
                                  df['new_col']-1))

你也可以把你的R代码翻译成python with datar 顺利:

>>> from datar.all import NA, f, tibble, select, mutate, if_else, is_na
>>> 
>>> df = tibble(
...     col_1 = [1, NA, 2, 3],
...     col_2 = [4, 5, NA, 7],
...     col_3 = [8, 9, 10, 1],
...     unk_col = list('abcd')
... )
>>> 
>>> df >> select(f.col_1, f.col_2, f.col_3) >> mutate(
...     new_col_ = if_else(is_na(f.col_1), NA, 2),
...     new_col = if_else(
...         is_na(f.col_2), 
...         f.new_col, 
...         if_else(f.col_3 == 1, f.new_col+1, f.new_col-1)
...     )
... )
      col_1     col_2   col_3   new_col
  <float64> <float64> <int64> <float64>
0       1.0       4.0       8       1.0
1       NaN       5.0       9       NaN
2       2.0       NaN      10       2.0
3       3.0       7.0       1       3.0

我是 datar 包的作者。有问题欢迎提issue