我想在Pandas中创建一个虚拟变量,如果5列文本中的任何一行包含特定字符串,则取值为1。我正在使用以下代码:
df[a]=np.where((df['col1']==string) | (df['col2']==string) | (df['col3']==string) | (df['col4']==string) | (df['col5']==string),1,0)
这很好用,但是内存非常密集。我在一个大的数据集上做了大约一千次,但是大小不应该是难以管理的 - 它是一个开始的演出(约100万行)。
在我看来,上面的代码必须以某种方式创建副本,因为我的机器上的内存使用量增长到80演出(真实和虚拟),这会导致问题。有没有更有效的方法来做到这一点?
答案 0 :(得分:1)
这是一种可以迭代执行的方法。通常我们试图避免迭代,但是在全向量操作使用太多内存的情况下,值得采取几个步骤。在使用不易矢量化的结构字段时尤其如此。
I = np.zeros(df.shape, bool)
for name, val in zip(df.dtype.names, [string1, string2, string3, ...]):
I |= (df[name]==val)
答案 1 :(得分:0)
更快的方法是使用np.any
并测试整个df(或通过将列名列表传递给df的子集来测试子集):
In [27]:
t=['hellos','python']
df = pd.DataFrame({'a':t, 'b':t, 'c':['hello', 'yes']})
df
Out[27]:
a b c
0 hellos hellos hello
1 python python yes
In [28]:
np.any(df=='hello')
Out[28]:
True