如何根据条件在熊猫中创建另一列?

时间:2021-03-04 07:02:58

标签: python pandas

我有两列 - Punchout 和 Contract。 我想要一个目录标志列,如果 Punchout 和 Contract 都是 NAN,则它为 FALSE,否则为 TRUE。 我写了以下一段代码:

val result = dfA.as("a")
  .withColumn("keys", array(dfA.columns.map(col): _*))
  .join(
    dfB.as("b"),
    array_contains(col("keys"), col("b.Key"))
  ).groupBy("a.Key")
  .agg(
    concat_ws(",", collect_list(col("data"))).as("data")
  )

result.show
//+----+-----------+
//| Key|       data|
//+----+-----------+
//|ALK1|G1,G3,G4,G5|
//|ALK2|G2,G6,G7,G8|
//+----+-----------+

但它抛出的错误是:req_line['Catalog_Flag'] = np.where((req_line['Contract']) & (req_line['Punchout']) = '[]',False,True)

还有别的办法吗?请帮忙!

样本数据

SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

2 个答案:

答案 0 :(得分:3)

这里 np.where 不是必需的,只需将 ~ 用于带 Series.isna 的反转掩码:

req_line['Catalog_Flag'] = ~(req_line['Contract'].isna() & req_line['Punchout'].isna())

使用 | 按位 OR by Series.notna 测试是否没有缺失值:

req_line['Catalog_Flag'] = req_line['Contract'].notna() | req_line['Punchout'].notna()

print (req_line)
          Contract              Punchout   Flag  Catalog_Flag
0              NaN                   NaN  False         False
1              NaN  Computer Information   True          True
2  Non-CLM0_Cat_01                   NaN   True          True

答案 1 :(得分:2)

使用 Series.isna 来标识 nan

req_line['Catalog_Flag'] = np.where(req_line['Contract'].isna() & req_line['Punchout'].isna(), False, True)