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



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

如果列"诱导"包含文本(不是空的,也不是"(,我需要添加一个1,否则0

我试过

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

此命令仅适用于以"开头的字符串值,但如果为null则不起作用。

你知道如何正确添加这一列吗?

根据德摩根定律,NOT(cond1或cond2(等价于AND(NOT(condl(AND NOT(cond2((。

您可以根据需要通过"and"(&(/或"(|("运算符组合条件。这给出了一个布尔级数,然后可以将其转换为int:

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

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

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

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

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

由于内置的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)

相关内容

最新更新