我需要向Pandas数据框添加一个新列。
如果“诱导”列中包含文本(非空且非“”),则需要添加1,否则为0
我尝试过
df['newColumn'] = np.where(df['INDUCING']!="", 1, 0)
此命令仅适用于以“”开头的字符串值,但如果为null,则无效。
关于如何正确添加此列的任何想法吗?
答案 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)