使用依赖于另一列的布尔值创建一个新的Pandas df列

时间:2018-10-27 19:53:45

标签: python pandas

我需要向Pandas数据框添加一个新列。

如果“诱导”列中包含文本(非空且非“”),则需要添加1,否则为0

我尝试过

df['newColumn'] = np.where(df['INDUCING']!="", 1, 0)

此命令仅适用于以“”开头的字符串值,但如果为null,则无效。

关于如何正确添加此列的任何想法吗?

3 个答案:

答案 0 :(得分:2)

通过De Morgan's laws,NOT(cond1或cond2)等同于AND(NOT(cond1)和NOT(cond2))。

您可以根据需要通过按位“和”(&)/“或”(|)运算符组合条件。这给出了一个布尔序列,然后可以将其强制转换为int

df['newColumn'] = (df['INDUCING'].ne('') & df['INDUCING'].notnull()).astype(int)

答案 1 :(得分:1)

最简单的方法是先进行.fillna('')。更正:

df['newColumn'] = np.where(df['INDUCING'].fillna('') != "", 1, 0)

或直接将.astype(int)传递给掩码。这会将True转换为1,将False转换为0:

df['newcol'] = (df['INDUCING'].fillna('') != '').astype(int)

答案 2 :(得分:0)

由于内置bool会在字符串上精确生成True(如果它是非空的),则可以通过以下方式简单实现

df['newColumn'] = df['INDUCING'].astype(bool).astype(int)

一些性能比较:

In [61]: df = pd.DataFrame({'INDUCING': ['test', None, '', 'more test']*10000})

In [63]: %timeit np.where(df['INDUCING'].fillna('') != "", 1, 0)
5.68 ms ± 500 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [62]: %timeit (df['INDUCING'].ne('') & df['INDUCING'].notnull()).astype(int)
5.1 ms ± 223 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [64]: %timeit np.where(df['INDUCING'], 1, 0)
667 µs ± 25.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [65]: %timeit df['INDUCING'].astype(bool).astype(int)
655 µs ± 5.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [99]: %timeit df['INDUCING'].values.astype(bool).astype(int)
553 µs ± 18.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)