熊猫 - 从df中识别出独特的三胞胎

时间:2016-11-14 09:25:40

标签: python-2.7 pandas numpy

我有一个表示唯一项目的数据框。每个项目由一组varAvarBvarC唯一标识(因此每个项目的varAvarB或0的n值均为0 varC)。我的df每个唯一商品都有多个原始数据,包含varAvarBvarC的各种组合。

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是相同的项目:{varA:[a],varB:[b,k],varC:[c,l]}。
  • 2和4也是相同的:{varA:[d,m],varB:[e],varC:[f]}

我想识别每个独特的项目,给他们一个唯一的ID,并存储他们的信息。

我写的代码非常低效:

  • Step1 :我遍历数据框的每一行,并列出每个变量
    • 当这三个变量是新变量时,它是一个新项目,我给它一个id。
    • 当知道任何一个变量时,我将新的变量存储在各自的列表中并继续走到下一行
  • Step2 :一旦我走完所有数据帧,我就有两个子集:
    • 1,具有唯一ID,
    • 另一个没有唯一ID,但其信息可以在具有唯一ID的信息中找到,可以是varAvarBvarC。所以非常丑陋,我连续合并任一变量,并找到唯一的id。
  • 结果:我的df与开头相同,但是有一列重复的唯一标识符。

这适用于varAvarB条目中的20,000行。这在100,000行之前运行非常慢并且在结束之前(在Step1和Step2之间)死亡,我需要在1,000,000行上进行。

任何pandanique方式这样做?

1 个答案:

答案 0 :(得分: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