我在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多个这样的行。
有没有办法做到这一点,这样我就可以在函数中同时包含两个代码了?

最佳答案

您需要在sort_values列中添加p_id_x

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

10-06 03:22