簡體   English   中英

如何拆分 dataframe 和 select 所有可能的對?

[英]How to split a dataframe and select all possible pairs?

我有一個 dataframe,我想把它分開,以便應用某個 function。

我有字段 df['beam']、df['track']、df['cycle'] 並希望通過這三個字段中的每一個的唯一值將其分開。 然后,我想將這個 function (它在兩個單獨的數據幀之間工作)應用於滿足 df['track'] 兩者之間不同的每一對。 此外,如果您切換對的順序,結果也不會改變,所以如果可能的話,我不想對 function 進行不必要的調用。

我目前使用四個嵌套的 for 循環將其處理成一個 if 條件,但我絕對確定有更好、更簡潔的方法。

我會很感激所有的幫助!

編輯:我最終像這樣解決了它:

  1. 我使用 df.groupby() 將原始的 dataframe 分成多個

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

    這會生成一個字典,其中鍵是所有唯一的 ['beam','track','cycle'] 組合作為元組

  2. 我使用 itertools.combinations() 組合了所有可能的 ['beam','track','cycle'] 對

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

這會生成一個 2 元素元組列表,其中每個元素都是一個 ['beam','track','cycle'] 元組本身,並且不包括交換順序的元組,因此我避免調用 function 兩次對於相同的情況。

  1. 我通過 for 循環刪除了“track”相同的組合

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

現在我可以通過循環組合列表來調用我的 function

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 的列表中的所有元素返回到定義的 function,因此它的作用與前面的 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]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM