基于多行将数据框拆分为多个部分
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))
所以我想知道是否可以对包含多行的数据框进行排序。例如,假设有一个包含 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))