2017-06-26 57 views
0

我有以下大熊猫数据帧洗牌大熊猫数据帧的行,如果两列

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_elementsecond_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

这不是解决问题的最佳方法,但它会提供您期望的结果。我已经为你留下了第二部分。

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"]] 

sorted_df = df.sort_values(["first_element", "second_element"], ascending=[True, False]) 
sorted_df.reset_index(0, inplace = True) 

prev_min = sorted_df.first_element.iloc[0] 
prev_max = sorted_df.second_element.iloc[0] 

labels = [] 
label_counter = 1 
labels.append(label_counter) 

for rowIndex in xrange(1, sorted_df.shape[0]): 
    row = sorted_df.iloc[rowIndex] 

    if row.first_element > prev_max: 
     # totally different interval, may be overlapping interval 
     prev_min = row.first_element 
     prev_max = row.second_element 
     label_counter += 1 
     labels.append(label_counter) 
    elif row.first_element >= prev_min: 
     prev_max = max(prev_max, row.second_element) 
     labels.append(label_counter) 

sorted_df['overlapping_index'] = labels 

# group sorted_df by overlapping index, and randomly select the save interval group 
+0

我知道代码的最后一行输出一个包含所有重叠区间的熊猫数据帧。我不确定如何(1)如何将这些分成单独的相交区间组,以及(2)随机混洗这些指数,使得最终输出是原始数据帧。 – ShanZhengYang

+0

请参阅最新的答案。 – user3256363