在pandas df中按顺序排列值

时间:2016-11-24 06:13:43

标签: python python-2.7 python-3.x pandas

我在pandasas 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

我想写一个函数

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

我是第一个的所有组合,然后是b,然后是c。

这只是我行的一部分。我有20多个这样的行。 有没有办法做到这一点,所以我可以在函数中包含我的代码?

1 个答案:

答案 0 :(得分: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