我有一个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']
我想要的是
- “会话”号码,其中包含所有列表值
- “会话”号码,其中包含至少两个列表值
- 剩余的“会话”号码
醇>
仍然找不到它。
答案 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))
。