2016-11-14 264 views
1

識別唯一的三胞胎我代表獨特項數據幀。每個項目由一組varA,varBvarC(因此每個項目具有varA,varBvarC的0到n值)唯一地標識。我的DF擁有的每一個獨立的項目多原糖,用varAvarB,並且varC各種組合。大熊貓 - 從DF

的df是這樣的(ID是列中唯一的,但它並不代表唯一的項目)。

df = pd.DataFrame({'ID':[1,2,3,4,5], 
        'varA':['a', 'd', 'a', 'm','Z'], 
        'varB':['b', 'e', 'k', 'e',NaN], 
        'varC':['c', 'f', 'l', NaN ,'t']}) 

所以在這裏的DF,你可以看到:

  • 1和3是相同的項目有:{瓦拉:[A],varB:[B,K],VARC:並[c,1]}。
  • 2和4也相同:{翻:[d,M],varB:[E],VARC:[F]}

我想確定每個唯一項目,給他們唯一的ID,並存儲他們的信息。

我寫的代碼是非常低效的:

  • 第一步:我通過數據幀中的每一行走,讓每一個變量
    • 當三個變量是新的列表,這是一個新的項目,我給它一個ID。
    • 當任一變量是知道的,我保存了新的在各自的列表並保持行走到下一行
  • 第二步:有一次,我走了所有的數據幀,我有兩個亞羣:
    • 1有唯一的ID,
    • 另外一個沒有唯一的ID,但其信息可在具有唯一ID的人可以發現,無論是與varAvarB,或varC。因此,我非常不情願地在任一變量上合併,並找到唯一的ID。
  • 結果:我不是在開始時一樣DF,但反覆的獨特標識符列。

這20000行的進入與varAvarB效果很好。這在運行非常緩慢且在結束之前(步驟1和步驟2之間)在100,000行上死亡,我需要在1,000,000行上進行。

這樣做的任何pandanique方式?

+0

您能提供您的預期結果嗎? – Cleb

+0

鑑於3和4分別相同,你會給1和2分配一個唯一的ID嗎? (這意味着你保留了重複的第一次發生?) –

+0

我想給1和3同樣的唯一ID,和2和4一樣。類似於你的答案(非常酷的東西!),但每行應該有一個唯一的ID值。 –

回答

1

您可以使用使用鏈接的布爾索引duplicatedpd.Series.duplicated):

如果你想保留第一次出現的一個重複:

myfilter = ~df.varA.duplicated(keep='first') & \ 
      ~df.varB.duplicated(keep='first') & \ 
      ~df.varC.duplicated(keep='first') 

如果你不想

myfilter = ~df.varA.duplicated(keep=False) & \ 
      ~df.varB.duplicated(keep=False) & \ 
      ~df.varC.duplicated(keep=False) 

然後你就可以例如給這些增量UNIQUEID:

df.ix[myfilter, 'uniqueID'] = np.arange(myfilter.sum(), dtype='int') 
df 


    ID varA varB varC uniqueID 
0 1 a b c  0.0 
1 2 d e f  1.0 
2 3 a k l  NaN 
3 4 m e NaN  NaN 
4 5 Z NaN t  2.0 
+0

當我有兩個值(如varA和varB)重複兩次,但varC的最後一個值是NaN時,實際上遇到了一些麻煩。它似乎不被過濾。 –

+1

我終於找到了一個辦法。我用一個隨機值和一個常量字符串來替換所有的NaN。我在識別結束時將其刪除。爲了填補所有的UNIQUEID我用一組連續對每個變量 此外NaN的,你的代碼的方式更快的字符串整數。我想重複在整數相當慢。 再次感謝我向他展示我的方式 –