2017-09-28 181 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))