我有以下大熊貓數據幀洗牌大熊貓數據幀的行,如果兩列
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