簡體   English   中英

在熊貓中創建虛擬變量而不進行復制

[英]Creating a dummy variable in Pandas without making copies

我想在Pandas中創建一個虛擬變量,如果文本的5列中的任何一列包含特定字符串,則其值均為1。 我正在使用以下代碼:

df[a]=np.where((df['col1']==string) | (df['col2']==string) | (df['col3']==string) | (df['col4']==string) | (df['col5']==string),1,0)

這很好用,但是占用大量內存。 我在一個龐大的數據集上執行了大約一千次,但是大小應該不是難以控制的-它大約要開始一個演出(大約一百萬行)。

在我看來,上面的代碼必須以某種方式創建副本,因為我的計算機上的內存使用量增長到80 gig(真實和虛擬),這會引起問題。 有沒有更有效的方法可以做到這一點?

這是您可以迭代執行的方法。 通常,我們會嘗試避免迭代,但是在完整向量操作占用過多內存的情況下,值得采取一些步驟。 在處理不容易向量化的結構字段時尤其如此。

I = np.zeros(df.shape, bool)
for name, val in zip(df.dtype.names, [string1, string2, string3, ...]):
    I |= (df[name]==val)

一種更快的方法是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM