2016-02-20 126 views
4

我有一個使用Postgres SQL的類似問題,但我認爲這種任務在Postgres中確實很難做到,我認爲python/pandas會使這更容易,儘管我仍然無法完全想出解決方案。所有可能的排列列Pandas Dataframe在同一列內

我現在有一個熊貓數據幀,看起來像這樣:

df={'planid' : ['A', 'A', 'B', 'B', 'C', 'C'], 
    'x' : ['a1', 'a2', 'b1', 'b2', 'c1', 'c2']} 

df=pd.DataFrame(df) 

df 


    planid x 
0 A  a1 
1 A  a2 
2 B  b1 
3 B  b2 
4 C  c1 
5 C  c2 

我想在那裏planid不等於彼此所有可能的排列。換句話說,將planid中的每個值看作「桶」,如果我要從planid中的每個 「桶」中抽取x的值,我想要所有可能的組合。 (a1,b1,c1),(a1,b2,c1),(a1,b1,c2),(a1,b2,c2),(a2,b1,c1) ,(a2,b2,c1),(a2,b1,c2),(a2,b2,c2)}。

但是,我希望我的結果數據幀爲三列,planid,x和另一列,可能名稱爲permutation_counter。最終數據幀具有標記爲permutation_counter的所有不同排列。換句話說,我希望我的最終數據框看起來像

 planid x permutation_counter 
    0 A  a1  1 
    1 B  b1  1 
    2 C  c1  1 
    3 A  a1  2 
    4 B  b2  2 
    5 C  c1  2 
    6 A  a1  3 
    7 B  b1  3 
    8 C  c2  3 
    9 A  a1  4 
    10 B  b2  4 
    11 C  c2  4 
    12 A  a2  5 
    13 B  b1  5 
    14 C  c1  5 
    15 A  a2  6 
    16 B  b2  6 
    17 C  c1  6 
    18 A  a2  7 
    19 B  b1  7 
    20 C  c2  7 
    21 A  a2  8 
    22 B  b2  8 
    23 C  c2  8 

任何幫助將不勝感激!

回答

2

我試圖將盡可能多的步驟鏈接在一起。打破他們,看看每一步操作:)

df2 = pd.DataFrame(index=pd.MultiIndex.from_product([subdf['x'] for p, subdf in df.groupby('planid')], names=df.planid.unique())).reset_index().stack().reset_index() 

df2.columns = ['permutation_counter', 'planid', 'x'] 
df2['permutation_counter'] += 1 

print df2[['planid', 'x', 'permutation_counter']] 

    planid x permutation_counter 
0  A a1     1 
1  B b1     1 
2  C c1     1 
3  A a1     2 
4  B b1     2 
5  C c2     2 
6  A a1     3 
7  B b2     3 
8  C c1     3 
9  A a1     4 
10  B b2     4 
11  C c2     4 
12  A a2     5 
13  B b1     5 
14  C c1     5 
15  A a2     6 
16  B b1     6 
17  C c2     6 
18  A a2     7 
19  B b2     7 
20  C c1     7 
21  A a2     8 
22  B b2     8 
23  C c2     8 
2

@ Happy001通過幾分鐘的打我,但我會繼續前進,反正發佈此,因爲我認爲這是一個比較容易遵循:

import numpy as np 
import pandas as pd 
import itertools 

x = list(itertools.product(['a1','b2'],['b1','b2'],['c1','c2'])) 
x = list(itertools.chain(*x)) 
df = pd.DataFrame({ 'planid' : np.tile(list('ABC'), 8), 
        'x'  : x, 
        'p_count' : np.repeat(range(1,9), 3) }) 

結果:

p_count planid x 
0   1  A a1 
1   1  B b1 
2   1  C c1 
3   2  A a1 
4   2  B b1 
5   2  C c2 

... 

21  8  A b2 
22  8  B b2 
23  8  C c2 
+0

嘿強尼。這有點容易遵循,但在我的實際情況中,我確實有很多值,並且不能明確指定'a1','b2'等。 – Vincent

+0

儘管感謝您的幫助! – Vincent

+0

@Vincent - 當然,希望它有幫助。我懷疑這可能是一般化來處理您的情況,但我不清楚您的樣本數據將如何映射到您的實際數據。 Happy001以一種聰明的方式處理了這個問題(對from_product使用groupby),希望這對你的真實數據也有效,但我不確定它會如何。實際上,我們的答案基本上都是一樣的,所以你可以混合和匹配每個片段。 – JohnE

相關問題