基于多行将数据框拆分为多个部分

Splitting Dataframe into multiple parts based on multiple rows

所以我想知道是否可以对包含多行的数据框进行排序。例如,假设有一个包含 5 行的数据框,我想随机选择几行,在这种情况下假设为 2,我将其指定为质心 1 和质心 2,然后根据这些行对数据框进行排序。在这种情况下,小于centroid1的行在它上面,大于centroid1但小于centroid2的行在它们之间,大于centroid2的行在centroid2下面。

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 个中心的示例,但是会有另一个中心来划分数据。

如有任何建议,我们将不胜感激。如果需要有关此问题的任何进一步信息或解释,请告诉我。

感谢阅读

只要样本已经按总和的升序排列,我们就可以迭代地应用比较行

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