我有以下数据帧:
import pandas as pd
import numpy as np
ds = pd.DataFrame({'z':np.random.binomial(n=1,p=0.5,size=10),
               'x':np.random.binomial(n=1,p=0.5,size=10), 
               'u':np.random.binomial(n=1,p=0.5,size=10), 
               'y':np.random.binomial(n=1,p=0.5,size=10)})ds
z   x   u   y0   0   1   0   0
1   0   1   1   1
2   1   1   1   1
3   0   0   1   1
4   0   0   1   1
5   0   0   0   0
6   1   0   1   1
7   0   1   1   1
8   1   1   0   0
9   0   1   1   1
如何为列表中指定的变量名选择具有值(0,1)的行?
这是我到目前为止:
zs = ['z','x']
tf = ds[ds[zs].values == (0,1)]
tf
现在打印:
z   x   u   y0   0   1   0   0
0   0   1   0   0
1   0   1   1   1
1   0   1   1   1
2   1   1   1   1
3   0   0   1   1
4   0   0   1   1
5   0   0   0   0
7   0   1   1   1
7   0   1   1   1
8   1   1   0   0
9   0   1   1   1
9   0   1   1   1
其中显示重复项并且行不正确(行#2 - 1,1,1,1)。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您可以使用广播的numpy比较:
df[(df[['z','x']].values == [0, 1]).all(1)]
z  x  u  y
0  0  1  0  0
1  0  1  1  1
7  0  1  1  1
9  0  1  1  1
您还可以使用np.logical_and.reduce:
cols = ['z', 'x']
vals = [0, 1]
df[np.logical_and.reduce([df[c] == v for c, v in zip(cols, vals)])]
z  x  u  y
0  0  1  0  0
1  0  1  1  1
7  0  1  1  1
9  0  1  1  1
最后,假设列名称兼容,动态生成查询表达式字符串以用于query:
querystr = ' and '.join([f'{c} == {v!r}' for c,  v in zip(cols, vals)])
df.query(querystr)
z  x  u  y
0  0  1  0  0
1  0  1  1  1
7  0  1  1  1
9  0  1  1  1
这里的{v!r}和{repr(v)}相同。