2017-09-28 180 views
1

所以我想知道是否可以對多行​​數據框進行排序。例如,假設有一個有5行的數據框,我想隨機選擇幾行,在這種情況下,我會說2,我將它指定爲centroid1和centroid2,然後根據這些行對數據框進行排序。在這種情況下,小於質心1的行高於質心1,大於質心1但小於質心2的行位於它們之間,大於質心2的行位於質心2以下。根據多行將數據幀拆分爲多個部分

def compareRows(arr1, arr2): 
    a1 = sum(arr1) 
    a2 = sum(arr2) 
    return a1 > a2 

這個函數是我如何比較行。

data = np.array(pd.read_csv('https://raw.githubusercontent.com/gsprint23/cpts215/master/progassignments/files/cancer.csv', header=None)) 
    data = data.T 
    #print(data) 
    df = pd.DataFrame(data[1:], columns=data[0], dtype=float).T 

    sampled = df.sample(1) 
    d = df.drop(sampled.index) 
    gt = d.apply(compareRows, 1, arr2=sampled.squeeze()) 
    df = pd.concat([d[~gt], sampled, d[gt]]) 

我明白如何做到這一行。上面的代碼讀入數據集,然後將其放入數據框中。之後,它從框架中取一個樣本,將其刪除,然後應用compareRows函數來比較其他行是大於還是小於它並將它們附加到正確的位置。我的問題是是否可以概括這個過程,以便它可以用1,2,3 ... n行完成。因此,如果我選擇了3箇中心,它與我上面的2箇中心的例子類似,但是會有另一箇中心來分區數據。

任何意見表示讚賞。請讓我知道是否需要任何關於這個問題的進一步的信息或解釋。

感謝您閱讀

+0

只是遍歷最後三行代碼,每次應用不同的樣本(質心) –

+0

但是,難道僅僅根據當前質心對數據幀進行排序?我需要它是這樣安排的,即如果有兩個質心,那麼低於第一個質心,那麼高於第一個但低於第二個質心的是中間,而大於第二個是在第二個。如果我這樣做了,它只會用一個質心對它進行排序。 –

+0

*然後根據這些行對數據幀進行排序* ...如何按行排序df? 78列將使用什麼值?通常按列排序。 – Parfait

回答

1

我們可以應用在它們的總和的遞增的順序,只要樣品已經反覆比較行

def compareRows(arr1, arr2): 
    a1 = sum(arr1) 
    a2 = sum(arr2) 
    return a1 > a2 

def sort_centroids(samples): #just sorts the samples in increasing order of their sum 
    order = [float(i.sum(axis=1)) for i in samples] 
    std=sorted(zip(samples,order),key=lambda x: x[1],reverse=True) 
    return [i[0] for i in std] 

import numpy as np 
import pandas as pd 

data = np.array(pd.read_csv('https://raw.githubusercontent.com/gsprint23/cpts215/master/progassignments/files/cancer.csv', header=None)) 
data = data.T 
df = pd.DataFrame(data[1:], columns=data[0], dtype=float).T 

num_centroids = 10 

samples = [df.sample(1) for i in range(num_centroids)] 
samples = sort_centroids(samples) 

for i in range(num_centroids): #loop over centroids one by one 
    d = df.drop(samples[i].index) 
    gt = d.apply(compareRows, 1, arr2=samples[i].squeeze()) 
    df = pd.concat([d[~gt], samples[i], d[gt]]) 

健全檢查:

o=[float(i.sum(axis=1)) for i in samples] 
o.reverse() 
print(o) 
print() 
print(df.sum(axis=1))