我有以下大熊猫数据帧洗牌大熊猫数据帧的行,如果两列
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
在该数据帧之间的值“重叠”,每行被认为是一个“间隔”沿着实线,[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]
,而不是混淆重叠的时间间隔的子集。
有几种方式可以用熊猫来改变行,例如,由索引洗牌
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)如何做一个搜索在Python的/熊猫方式,所有的重叠区间,(2)我怎么选择这些子集重叠的时间间隔,只能单独洗牌?
我知道代码的最后一行输出一个包含所有重叠区间的熊猫数据帧。我不确定如何(1)如何将这些分成单独的相交区间组,以及(2)随机混洗这些指数,使得最终输出是原始数据帧。 – ShanZhengYang
请参阅最新的答案。 – user3256363