在Pandas中创建虚拟变量而不进行复制

时间:2015-02-28 03:33:44

标签: python numpy pandas

我想在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演出(真实和虚拟),这会导致问题。有没有更有效的方法来做到这一点?

2 个答案:

答案 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