Pandas DataFrame基于多个列的值选择行,这些列的名称在列表中指定-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Pandas DataFrame基于多个列的值选择行,这些列的名称在列表中指定

一码平川MACHEL 2019-01-22 16:54:09 2528

我有以下数据帧:

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)。

Python
分享到
取消 提交回答
全部回答(1)
  • 一码平川MACHEL
    2019-07-17 23:26:20

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

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程