【问题标题】:Pandas - identify unique triplets from a dfPandas - 从 df 中识别唯一的三元组
【发布时间】:2017-03-27 21:23:51
【问题描述】:

我有一个代表独特项目的数据框。每个项目由一组varAvarBvarC 唯一标识(因此每个项目对于varAvarBvarC 具有0 到n 个值)。我的 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 行上完成。

有什么办法可以做到这一点吗?

【问题讨论】:

  • 您能提供您的预期结果吗?
  • 如果 3 和 4 分别相同,你会给 1 和 2 一个唯一的 ID 吗? (意思是你保留第一次出现的重复吗?)
  • 我想为 1 和 3 提供相同的唯一 ID,并为 2 和 4 提供相同的 ID。类似于您的答案(非常酷的东西!),但每一行都应该有一个唯一的值身份证。

标签: python-2.7 pandas numpy


【解决方案1】:

您可以通过duplicated (pd.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)

然后你可以例如给这些增加一个唯一ID:

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

【讨论】:

  • 当我有两个值(比如 varA 和 varB)出现两次但 varC 的最后一个值为 NaN 的重复项时,我实际上遇到了一些麻烦。好像没有过滤。
  • 我最终找到了一种方法。我用随机值和一个常量字符串制作了一个掩码来替换所有的 NaN。我在标识的末尾删除了它们。为了填写 uniqueID 中的所有 NaN,我在每个变量上连续使用了一个组此外,您的代码在字符串上比整数更快。我猜在整数上重复的速度很慢。再次感谢您为我指路
猜你喜欢
  • 2011-01-24
  • 2017-03-28
  • 2020-02-22
  • 1970-01-01
  • 2022-07-07
  • 2017-02-26
  • 2021-09-15
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多