查找具有二进制值的pandas数据帧中可用值的列表

时间:2014-03-04 10:47:23

标签: python pandas dataframe

我有一个DataFrame如下:

   session  p1  p2  p3  p4  p5  p6  p7  p8  p9  p10
0        1   1   0   0   1   1   0   1   0   1    0
1        2   1   0   0   0   1   0   1   0   1    1
2        3   1   0   1   0   1   0   0   0   1    0
3        4   0   1   1   1   0   1   0   1   0    0
4        5   1   1   0   0   1   0   1   1   1    1
5        6   0   0   1   0   1   1   0   1   0    0
6        7   1   1   0   1   0   1   0   0   1    0
7        8   1   0   0   0   1   0   1   1   1    1
8        9   0   1   1   0   1   0   1   0   0    0
9       10   1   1   0   1   0   1   0   1   1    0

我有以下列表值。

listvals = ['p1','p5','p9']

我想要的是

  
      
  1. “会话”号码,其中包含所有列表值
  2.   
  3. “会话”号码,其中包含至少两个列表值
  4.   
  5. 剩余的“会话”号码
  6.   

仍然找不到它。

1 个答案:

答案 0 :(得分:2)

假设“包含所有列表值”,则表示相应的列为1:

>>> df.session[df[listvals].sum(axis=1) == len(listvals)]
0    1
1    2
2    3
4    5 
7    8
Name: session, dtype: int64
>>> df.session[df[listvals].sum(axis=1) >= 2]
0     1
1     2
2     3
4     5
6     7
7     8
9    10
Name: session, dtype: int64
>>> df.session[df[listvals].sum(axis=1) <= 1]
3    4
5    6
8    9
Name: session, dtype: int64

请注意,这假设所有值都是0或1,因为问题中的“二进制值”看起来如此。如果我们只知道它是0或某个非零值,我们就可以使用(df[listvals] != 0).sum(axis=1),这样[0,3,0]就不会欺骗我们。

如果您希望会话编号按所包含列数分组,则可以使用groupby,例如df["session"].groupby(df[listvals].sum(axis=1))