1

我正在将代码从 R 转换为 Python,并正在寻找一些帮助,以使用dfply语法/管道根据其他列改变新列

在这个例子中,我想从col1if col2is 'c' 中减去 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})

在 RI 会做:

df_new <- df %>% 
  mutate(newCol = ifelse(col2 == 'c', col1 - 2, col1 + 4))

但 Python 似乎不喜欢这样:

new_df = (df >>
    mutate(newCol = np.where(X.col2 == 'c', X.col1 - 2, X.col1 + 4)))

我收到“无效的 __array_struct__”错误

请注意,这可以正常工作:

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

2 回答 2

3

我将使用 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
于 2019-06-18T18:23:33.937 回答
0

这里的 python 等价物将是一个内联if else表达式(或三元运算符):

ifelse(col2 == 'c', col1 - 2, col1 + 4)

那么就会变成

col1 - 2 if col2 == 'c' else col1 + 4
于 2019-06-18T18:11:33.437 回答