2017-06-26 58 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