按重叠范围

时间:2018-01-13 19:26:28

标签: python pandas group-by overlap

我有一个数据框,其中left列是对象的最左侧位置,right列是最右侧的位置。如果对象重叠,我需要对它们进行分组,或者它们重叠(递归)重叠的对象。 因此,例如,如果这是我的数据帧:

     left  right
0      0    4
1      5    8
2      10   13
3      3    7
4      12   19      
5      18   23
6      31   35

所以行03重叠 - 因此它们应该位于同一个组中,并且行1也是重叠的行3 - 因此它会加入该组。

因此,对于这个例子,输出应该是这样的:

     left  right    group
0      0    4         0
1      5    8         0
2      10   13        1
3      3    7         0
4      12   19        1
5      18   23        1
6      31   35        2

我想到了各种方向,但没有想出来(没有丑陋的for)。 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

您可以尝试使用override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent DispatchQueue.main.async { addTitleLabel() } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIApplication.shared.statusBarStyle = .default } func addTitleLabel(){ var titleLabel: UILabel = UILabel() titleLabel.textColor = .white titleLabel.textAlignment = .center titleLabel.text = "Home" self.navigationItem.titleView = titleLabel } rollingmax rolling来查找范围的交叉点:

min

例如,(1,3)和(2,4) 找到交叉点

mix(3,4)-max(1,2)= 1; 1大于0;然后两个间隔有交集

答案 1 :(得分:2)

我发现已接受的解决方案(更新:现在已删除)具有误导性,因为它不能推广到类似情况。例如对于以下示例:

df = pd.DataFrame({'left': [0,5,10,3,12,13,18,31], 
    'right':[4,8,13,7,19,16,23,35]})
df

建议的聚合函数输出以下数据帧(请注意,18-23和12-19应当在组1中)。

enter image description here

一种解决方案是使用以下方法(基于组合间隔posted by @CentAu的方法):

# Union intervals by @CentAu
from sympy import Interval, Union
def union(data):
    """ Union of a list of intervals e.g. [(1,2),(3,4)] """
    intervals = [Interval(begin, end) for (begin, end) in data]
    u = Union(*intervals)
    return [u] if isinstance(u, Interval) \
        else list(u.args)

# Create a list of intervals
df['left_right'] = df[['left', 'right']].apply(list, axis=1)
intervals = union(df.left_right)

# Add a group column
df['group'] = df['left'].apply(lambda x: [g for g,l in enumerate(intervals) if 
l.contains(x)][0])

...输出:

enter image description here

答案 2 :(得分:0)

您可以对样本进行排序并利用累积函数 cumsum left right 0 0 4 3 3 7 1 5 8 2 10 13 4 12 19 5 13 16 6 18 23 7 31 35 。举个例子:

df = df.sort_values(['left', 'right'], ascending=[True, False])

首先,您需要对值进行排序,以便将更长的范围放在首位:

   left  right
0     0      4
3     3      7
1     5      8
2    10     13
4    12     19
5    13     16
6    18     23
7    31     35

结果:

df['group'] = (df['right'].cummax().shift() <= df['left']).cumsum()
df.sort_index(inplace=True)

然后您可以通过比较“左”与之前的“右”值来找到重叠的组:

   left  right  group
0     0      4      0
1     5      8      0
2    10     13      1
3     3      7      0
4    12     19      1
5    13     16      1
6    18     23      1
7    31     35      2

结果:

$(function () {
        $('div').each(function () {
            var $this = $(this);
            var h = new Hammer(this);
            h.get('swipe').set({ direction: Hammer.DIRECTION_ALL,velocity:0.3 });  

            h.on("swipeup", async function (e) {
                SlidePage($this,"down",definedLocations);
            });
            h.on("swipedown", async function (e) {
                SlidePage($this,"up",definedLocations);
            });

            h.on("swipeleft", async function (e) {
                SlidePage($this,"left",definedLocations);
            });
            h.on("swiperight", async function (e) {
                SlidePage($this,"right",definedLocations);
            });    
        });
    });

一行: