簡體   English   中英

如何生成不重復的排列

[英]How to generate permutations without repetition

我有一張如下所示的表格

Loc ID 篩選 P1
一個 ABC1 GHY 55.6
一個 DFT1 生長激素 67.8
HJH5 GHY 67
C HKL BHY 78
GTY 生長激素 60

我想要 output 如下。 基本上,我希望具有相同過濾器的記錄為一行

篩選 ID Loc P1 m_Loc m_p1 全部的
GHY ABC1 一個 55.6 HJH5 67 122.6
生長激素 DFT1 一個 67.8 GTY 60 127.8

這是否可以使用 itertools i python 來實現。 如果是的話,有人可以建議我們怎么做嗎?

這是一個使用leadrow_number的解決方案,我認為它更好一些。

select filter
      ,id
      ,loc 
      ,p1
      ,m_id
      ,m_loc
      ,m_p1

from 
      (with t2 as 
      (select row_number () over( partition by filter order by filter desc) as rn
      ,*
       from t)
              select rn,filter, id, loc, p1
             ,lead(id) over( partition by filter order by filter)  as m_id
             ,lead(loc) over( partition by filter order by filter) as m_loc
             ,lead(p1) over( partition by filter order by filter)  as m_p1
              from t2) t
where rn=1  
篩選 ID 位置 p1 m_loc m_p1
BHY HKL C 78 null null null
生長激素 DFT1 一個 67.8 GTY 60
GHY ABC1 一個 55.6 HJH5 67

小提琴

這個問題應該有更好的解決方案,但這里有一個基於您所做的解決方案。 我使用left join來不丟失只出現一次的過濾器,然后我使用group by來合並結果。

select t1.filter
      ,max(t1.id)  as id
      ,max(t1.loc) as loc
      ,max(t1.p1)  as p1
      ,min(t2.id)  as m_id
      ,min(t2.loc) as m_loc
      ,min(t2.p1)  as m_p1
      
from t as t1 left join t as t2 on t2.filter = t1.filter and t2.id <> (t1.id)
group by t1.filter
篩選 ID 位置 p1 m_loc m_p1
BHY HKL C 78 null null null
生長激素 GTY 67.8 DFT1 一個 60
GHY HJH5 67 ABC1 一個 55.6

小提琴

如果可以使用 pandas,您可以通過以下方式實現靈活的解決方案:

數據定義:

df=pd.DataFrame({'Loc': {0: 'A', 1: 'A', 2: 'B ', 3: 'C', 4: 'B'},
 'ID': {0: 'ABC1', 1: 'DFT1', 2: 'HJH5', 3: 'HKL', 4: 'GTY'},
 'filter': {0: 'GHY', 1: 'FGH', 2: 'GHY', 3: 'BHY', 4: 'FGH'},
 'P1': {0: 55.6, 1: 67.8, 2: 67.0, 3: 78.0, 4: 60.0}}) 

重復列的創建:

cols=["{}_{}".format(N, c) for N in range(0,df.groupby('filter').count()['ID'].max()) for c in df.columns]

在這里,我首先通過查找每個過濾器df.groupby('filter').count()['ID'].max()的最大出現次數來找到所需的最大重復次數。 剩下的代碼只是通過添加一個前導數字來格式化。

創建新的 dataframe, filter作為索引,生成的列cols作為列

df_new=pd.DataFrame(index=set(df['filter']), columns=cols)

現在我們必須填寫數據:

for fil in df_new.index:
    values=[val for row in df[df['filter']==fil].values for val in row]
    df_new.loc[fil,df_new.columns[:len(values)]]=values

這里做了兩件事:首先,基於過濾器名稱fil選擇的值被[val for row in df[df['filter']==fil].values for val in row] 然后,這些值從左側開始填充到 dataframe 中。

結果如預期:

    0_Loc   0_ID    0_filter    0_P1    1_Loc   1_ID    1_filter    1_P1
GHY     A   ABC1    GHY     55.6    B   HJH5    GHY     67.0
BHY     C   HKL     BHY     78.0    NaN     NaN     NaN     NaN
FGH     A   DFT1    FGH     67.8    B   GTY     FGH     60.0

暫無
暫無

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

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