2016-11-14 109 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的,你的代码的方式更快的字符串整数。我想重复在整数相当慢。 再次感谢我向他展示我的方式 –