【发布时间】:2017-06-26 01:39:32
【问题描述】:
我有以下熊猫数据框
import numpy as np
import pandas as pd
df = pd.DataFrame({"first_element":[20, 125, 156, 211, 227, 220, 230, 472, 4765], "second_element":[35, 145, 178, 233, 321, 234, 231, 498, 8971], "next":[0.32, 0.04, 0.59, 0.103, 0.37, 0.92, 0.81, 0.24, 0.77]})
df = df[["first_element", "second_element", "next"]]
print(df)
### print(df) outputs:
first_element second_element next
0 20 35 0.320
1 125 145 0.040
2 156 178 0.590
3 211 233 0.103
4 227 321 0.370
5 220 234 0.920
6 230 231 0.810
7 472 498 0.240
8 4765 8971 0.770
在这个 DataFrame 中,每一行都被认为是沿着一条实线的“间隔”,[first_element, second_element],例如20 到 35、125 到 145。
如果我想根据两列对df 进行排序,我会使用.sort_values(),即
sorted_df = df.sort_values(["first_element", "second_element"], ascending=[True, False])
哪个输出
print(sorted_df)
first_element second_element next
0 20 35 0.320
1 125 145 0.040
2 156 178 0.590
3 211 233 0.103
5 220 234 0.920
4 227 321 0.370
6 230 231 0.810
7 472 498 0.240
8 4765 8971 0.770
有几个相交/重叠的区间,即[211, 233], [220, 234], [227, 321], [230, 231]。因为[230, 231] 是[211, 233] 的子集,所以有几种方法可以订购这两者。
我的目标是 (1) 编写一个函数来查找所有重叠的“区间”(first_element 和 second_element 两列中的值)和 (2) 随机打乱这些区间。
目标 (2) 听起来很棘手,因为需要分别对重叠间隔的多个“组”进行洗牌/重新排序。例如,假设我们的数据框更大,并且有以下重叠间隔:
[211, 233], [220, 234], [227, 321], [230, 231], [5550, 5879], [5400, 5454]
我想分别重新洗牌 [211, 233], [220, 234], [227, 321], [230, 231] 和 [5550, 5879], [5400, 5454],而不是混淆重叠区间的子集。
有几种方法可以用 pandas 打乱行,例如按索引随机播放
def shuffle_by_index(df):
index = list(df.index)
random.shuffle(index)
df = df.ix[index]
df.reset_index()
return df
或使用sklearn
import sklearn.utils
shuffled = sklearn.utils.shuffle(df)
df = df.reset_index(drop=True)
但是 (1) 如何以 pythonic/pandas 的方式搜索所有重叠区间以及 (2) 我如何选择这些重叠区间的子集并仅单独打乱它们?
【问题讨论】:
标签: sorting pandas dataframe intersection overlap