[英]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.