2016-11-24 53 views
1

我在pandasas DF表:安排在大熊貓的訂單價值DF

p_id_x p_id_y count 
    a   b   2 
    b   c   4 
    a   c   8 
    d   a   1 
    x   a   6 
    m   b   3 
    c   z   7 

我WAM特林編寫一個函數

def function_combination(p_id): 
    df[['p_id_x', 'p_id_y']] = df[['p_id_x', 'p_id_y']].apply(sorted, axis=1) 
    df.groupby(['p_id_x', 'p_id_y'], as_index=False)['count'].sum() 

(該功能沒有完成,有錯誤) 我通過單獨運行函數內的代碼得到了結果。

df['p_id_x','p_id_y'] 

p_id_x p_id_y 
    a   b 
    b   c 
    a   c 
    a   d 
    a   x 
    b   m 
    c   z 

但我想我的輸出看起來像爲:

p_id_x p_id_y 
    a   b 
    a   c 
    a   d 
    a   x   
    b   c 
    b   m 
    c   z 

i'e所有的第一組合,繼以B,並隨後c。

這只是我行的一部分。我有20多個這樣的行。 有沒有辦法做到這一點,這樣我就可以在函數中使用我的代碼?

回答

1

您需要通過p_id_x列添加sort_values

df[['p_id_x', 'p_id_y']] = df[['p_id_x', 'p_id_y']].apply(sorted, axis=1) 
df = df.groupby(['p_id_x', 'p_id_y'], as_index=False)['count'].sum().sort_values('p_id_x') 

print (df) 
    p_id_x p_id_y count 
0  a  b  2 
1  a  c  8 
2  a  d  1 
3  a  x  6 
4  b  c  4 
5  b  m  3 
6  c  z  7 

print (df[['p_id_x','p_id_y']]) 
    p_id_x p_id_y 
0  a  b 
1  a  c 
2  a  d 
3  a  x 
4  b  c 
5  b  m 
6  c  z 

編輯的評論 - 用boolean indexing

mask = (df.p_id_x == 'a') & (df['count'] > 3) 
print (mask) 
0 False 
1  True 
2 False 
3  True 
4 False 
5 False 
6 False 
dtype: bool 

print (df[mask]) 
    p_id_x p_id_y count 
1  a  c  8 
3  a  x  6 

或者query

print (df.query("p_id_x == 'a' and count > 3")) 
    p_id_x p_id_y count 
1  a  c  8 
3  a  x  6 
+0

是有辦法,我可以得到數每個值在我的p_id_x? 我想給我的功能,如果條件如果條件如果> 3如果計數然後做一些' – Shubham

+0

請參閱更新。 – jezrael

+0

是的,其實我剛剛意識到我在開始時犯了一個大錯。 說,如果我有組合(A-C),和(C-A)'。適用(排序)'會comvert(C-a)至(A-C),因此我的C的組合都將丟失。這阻礙了我的解決方案。我會以其他方式解決它。然後使用你的解決方案 – Shubham