繁体   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