从另一个dataframe中添加行到Pandas dataframe

4
我正在尝试根据随机生成的行对数据框进行排序。数据框如下所示。我要做的是随机选择一行,称其为数据框中的中心点,然后使小于该行的行在它上方,大于中心点的行在它下方。但我不知道如何做到这一点,我已经提供了数据框和数据以及我用来比较行的函数。我通过将行中的值相加并将其与中心点的总和进行比较来决定行是小于还是大于。

有什么好的方法可以做到这一点吗?

任何建议都会受到赞赏。

def compareRows(arr1, arr2):
    arr1 = sum(arr1)
    arr2 = sum(arr2)
    return arr1 > arr2
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

如果您需要更多信息,请告诉我。感谢您的阅读。

1
一些评论:1.你的最终目标是什么?我感觉这里存在一个强烈的[XY]问题。我的意思是,我可以通过df.iloc[df.sum(1).argsort()]解决问题,然后每一行都处于一个位置,使得比它更高的每一行都在它下面,比它更低的每一行都在它上面。换句话说,它已经排序了。2.你是想自己实现随机快速排序吗?如果是这样,我不会尝试每次都通过操作数据框来完成它。 - piRSquared
我正在尝试从数据框中随机选择一行,然后使数据框中的其余行要么在该行上方(如果它们较低),要么在该行下方(如果它们较高)。例如,如果我选择第5行,则应对数据框进行排序,以使所有小于第5行的行位于其上方,而所有大于第5行的行位于其下方。我决定这样做的方式如上所示的函数所示。 - Srikar Murali
然后只需像这样对数据框进行排序 df = df.iloc[df.sum(1).argsort()],并使用 df.sample(1) 随机选择行。 - piRSquared
哦,我明白了,谢谢。但是我该如何将df.sample(1)与其他语句结合使用呢?请原谅,我还是个新手。不过还是非常感谢您的帮助。 - Srikar Murali
没问题,也不用道歉。我们回答问题是因为我们喜欢这样做。没有人强迫我帮助你 (-: - piRSquared
1个回答

2
  • 使用 pd.DataFrame.sample 随机抽取一行数据
  • 注意:这将返回一个只有一行的 DataFrame
  • 创建一个临时 DataFrame d,不包含随机行
  • 创建一个布尔型序列,用于确定哪些行大于我们的随机行
  • 通过不大于条件对临时 DataFrame 进行子集操作,添加随机行,再添加大于随机行的临时 DataFrame 子集

sampled = df.sample(1)
d = df.drop(sampled.index)
gt = d.apply(compareRows, 1, arr2=sampled.squeeze())

pd.concat([d[~gt], sampled, d[gt]])
# d[~gt].append(sampled).append(d[gt])

我明白,这是有道理的。那么我该如何在这种情况下使用 df = df.iloc[df.sum(1).argsort()] 呢?或者说,由于其他函数已经完成了交换操作,这个步骤是否还需要呢? 谢谢你的帮助。 - Srikar Murali
1
如果您只想做一次或几次,那么请使用此答案。如果您想一直这样做直到所有都排序完毕,那么不要使用此答案,只需找到每行的总和并相应地对数据框进行排序即可...例如:df = df.iloc[df.sum(1).argsort()] - piRSquared
另外一个快速的注意事项,是否可以使用多个点来完成这个任务?例如,假设有一个包含5行的数据框,我想随机选择几行,比如在这种情况下选择2行,我将把它们指定为centroid1和centroid2,然后根据这些行对数据框进行排序。在这种情况下,小于centroid1的行位于其上方,大于centroid1但小于centroid2的行位于它们之间,而大于centroid2的行位于centroid2下方。是否可以对2、3、4...n个质心进行操作呢? - Srikar Murali
那听起来像是一个新问题。 - piRSquared
是的,我把它作为一个新问题提出来了,但似乎没有人知道是否可能,所以我想知道你是否有什么想法。但是没错,这确实是一个新问题。 - Srikar Murali
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接