【问题标题】:how to create a new column conditional on other column by using existing columns in python如何使用python中的现有列以其他列为条件创建新列
【发布时间】:2017-09-14 13:46:41
【问题描述】:

我在 python 中有一个dataframe,看起来像这样

dt = pd.DataFrame({"language1": ["english", "english123", "ingles", "ingles123", "14.0", "13", "french"],
                   "language2": ["englesh", "english123", "ingles", "ingles123", "14", "13", "french"],
                   "language3": ["englesh", "engl", "ingles", "ingles123", "14", "13", "spanish"]})

我想做的是复制这个 R 代码,但在 python

dt[,language4:=ifelse(!language1%in%c("french"),paste0(language2,"_win"),paste0(language3,"_lose"))]

我试过了,但是不行

dt['language4'] = dt.apply(lambda x: ~x['language1'].isin(['french']), x['language2'] + "_win", x['language3']+"_lose")

所以我想出了这个

dt.loc[~dt['language1'].isin(["french"]),'language4'] = surv_dt_sd['language2'] + \
    "_win"

但我不知道如何在一行中实现else

【问题讨论】:

    标签: python r python-3.x pandas dataframe


    【解决方案1】:

    numpy.where 将在这里工作:

    dt['language4'] = np.where("french" not in dt['language1'], dt['language2'] + '_win', dt['language2'] + '_lose')
    

    【讨论】:

    • 这非常有效。谢谢 !就我而言,~ 运算符和 isin 是否有替代方案?
    • ~isin 在这里不是最合适的,因为它本质上是一个 SQL 反连接(例如 WHERE NOT IN),isin 将列表或集合作为参数.如果除了 "french" 之外还有多个要取反的精确值,您可以使用 ~dt['language1'].isin(['german', 'russian', 'japanese']) 作为 np.where 的第一个参数,但同样只适用于完全匹配。
    【解决方案2】:

    我也可以分享一下“apply + ifelse”的解决方案:

    dt['language4'] = dt.apply(lambda x: x['language2'] + "_win" if not('french' in x['language1']) else x['language3']+"_lose", axis=1)
    

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多