python - Pandas DataFrame 根据多个列的值选择行,这些列的名称在列表中指定

标签 python pandas dataframe

我有以下数据框:

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 方法可以在没有嵌套循环和暴力破解的情况下执行此操作。

最佳答案

您可以使用广播的 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)} 相同。

关于python - Pandas DataFrame 根据多个列的值选择行,这些列的名称在列表中指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299161/

相关文章:

python - 在 Python Polars 中获取每个 groupby/apply 的相关性

python keras如何改变卷积层到lstm层后输入的大小

python - 从 pyglet 还是 pygame 开始?

python - 如何从 Pandas 数据框的列值创建新行

apache-spark - 如何在Spark中获取总和

python - 由于 MACOSX_DEPLOYMENT_TARGET,Big Sur clang "invalid version"错误

python - 使用 pandas 向量函数查找匹配值对

pandas - "Indexing"到起始时间点(指数水平 = 100)的价格序列,带有 pandas 数据框 : P(i, t)/P(i)

python - 仅将函数应用于 Pandas Dataframe 列的一部分

python - 删除或替换列名中的空格