我有以下数据框:
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 y
0 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 y
0 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)。有什么想法或想法吗?当然,我假设有一种pythonic的方法可以执行此操作,而无需嵌套循环并强制执行。
答案 0 :(得分:3)
您可以使用广播的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)}
相同的地方。
答案 1 :(得分:2)
您可以这样做:
cols = ['u','x']
bools = ds[cols].apply(lambda x: all(x == (0,1)), axis=1)
ds[bools]
u x y z
0 0 1 1 1
7 0 1 0 1
8 0 1 1 0
答案 2 :(得分:1)
使用eq
,与Cold的numpy方法非常相似
df[df[zs].eq(pd.Series([0,1],index=zs),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
答案 3 :(得分:0)
一种更简单的方法是使用布尔索引:
document.querySelectorAll()