[英]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 来实现。 如果是的话,有人可以建议我们怎么做吗?
这是一个使用lead
和row_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.