我有一个数据框,其中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
所以行0
和3
重叠 - 因此它们应该位于同一个组中,并且行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
)。
任何帮助将不胜感激!
答案 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
}
rolling
和max
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中)。
一种解决方案是使用以下方法(基于组合间隔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])
...输出:
答案 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);
});
});
});
一行: