【问题标题】:Finding pairs of rows with minimum difference between two quantities查找两个数量之间差异最小的行对
【发布时间】:2018-07-13 01:48:34
【问题描述】:

我有一个包含 a 和 t 列的数据框 df,其中“a”列包含字符串,“t”列包含整数。我想从数据框中选择所有行对,其中该行对的“a”列中的值相同,并且该对的“t”列中的值差异具有最小值。例如:

df = a    t
    abc   4
    abc   3
    def   2
    abc   1

我想得到以下结果:

df = a    t
     abc  4
     abc  3

我知道我们可以在同一个数据框中使用两个 for 循环,但我正在寻找更有效的解决方案。 感谢期待

【问题讨论】:

  • 循环可能看起来很笨拙,但我并没有真正看到显着减少运行时间的方法(因为您基本上会以相同的次数枚举成对差异)。你觉得你的代码效率低吗?
  • 您能否在问题中添加更多数据并获得预期结果?
  • 我基本上想在“a”列中找到具有相同值的对,并且该对应该在“t”列的值上具有最小差异
  • 你有没有想过当你有多个相同的成对距离时你会遇到这样的情况?想象一下,您还有另一行 abc 0 甚至 abc 2。如果这些存在,您希望发生什么?
  • 如果我们有多个相同的成对距离,则应返回两行。但是,在您的问题中,无论如何,4 和 3 之间的差异是最小的,因此即使您提供的行已添加到数据框中,也应返回该对

标签: python pandas


【解决方案1】:

你可以使用:

df = df.sort_values(['a', 't'], ascending=False)
diff_ = df['t']-df['t'].shift(-1)
min_idx = diff_[df['a'] == df['a'].shift(-1)].idxmin()
df.loc[min_idx:min_idx+1]

输出:

    a   t
0   abc 4
1   abc 3

【讨论】:

  • 这并不能回答问题——OP想要所有差异对,而不仅仅是连续的。第二行也可以使用df['t'].diff()
  • @xyzjayne 我认为这种方法仍然有效,因为您首先对值进行排序。根据定义,最小差异将发生在排序后的连续行之间,因此这种方法似乎没问题。但它不一定会捕获重复的最小值
  • @HarvIpan 在什么情况下我们在使用这个方法时会得到“keyError”?另外,我们可以用 shift(1) 代替 shift(-1) 吗?
  • @DePP KeyError 告诉我您没有要访问的列。另外,关于班次,您可以参考文档here。 shift(1) 将元素移动到下一个序列,而 shift(-1) 则相反。我希望它有所帮助。
  • @HarvIpan 实际上,代码的最后一行给出了关键错误。当我对某些时间戳数据遵循相同的逻辑时,它似乎不起作用。
猜你喜欢
  • 2021-06-27
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多