2016-11-24 24 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