如何拆分数据框并选择所有可能的对?



我有一个数据框架,为了应用某个函数,我想把它分开。

我有字段df['beam'], df['track'], df['cycle'],我想用这三个字段的唯一值来分隔它们。然后,我想将这个函数(它在两个单独的数据帧之间工作)应用于满足df['track']在两者之间不同的每对。而且,如果您改变这对的顺序,结果也不会改变,所以我希望尽可能不要对该函数进行不必要的调用。

我目前使用四个嵌套的for循环来完成if条件,但我绝对肯定有更好,更干净的方法。

我很感激所有的帮助!

编辑:我最终是这样解决的:

  1. 我使用df.groupby()将原始数据帧分割成多个

    dfsplit=df.groupby(['beam','track','cycle'])

    这将生成一个字典,其中键都是唯一的['beam','track','cycle']组合,作为元组

  2. 我使用itertools.combination()组合了所有可能的['beam','track','cycle']对

    keys=list(itertools.combinations(dfsplit.keys(),2))

这将生成一个包含两个元素的元组列表,其中每个元素都是一个['beam','track','cycle']元组本身,并且它不包括交换了顺序的元组,因此我避免为相同的情况调用两次函数。

  1. 我通过for循环删除了'track'相同的组合

    for k in keys.copy():
    if k[0][1]==k[1][1]:
    keys.remove(k)
    

现在我可以通过循环遍历组合列表来调用函数

for k in keys:
function(dfsplit[k[0]],dfsplit[k[1]])

步骤3花费了很长时间,可能是因为我有很多唯一的['beam','track','cycle']组合,所以列表很长,但也可能是因为我做得不是最优的。我将保留这个问题,以防有人想到更好的方法来完成最后一步。

编辑2:通过执行

,再次使用itertools解决了步骤3中的问题。
keys=list(itertools.filterfalse(lambda k : k[0][1]==k[1][1], keys))

出现itertools。Filterfalse返回列表中所有返回false给所定义函数的元素,所以它和前面的for循环一样,只是选择了false而不是删除了true。它非常快,我相信这将永远解决我的问题。

我不知道如何将问题标记为已解决所以我在这里重复一下解决方案:

dfsplit=df.groupby(['beam','track','cycle'])
keys=list(itertools.combinations(dfsplit.keys(),2))
keys=list(itertools.filterfalse(lambda k : k[0][1]==k[1][1], keys))
for k in keys:
function(dfsplit[k[0]],dfsplit[k[1]])

相关内容

最新更新