动态过滤 pandas 数据框

2024-05-21

我正在尝试使用三列的阈值来过滤 pandas 数据框

import pandas as pd
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
df = df.loc[(df.A > 0) & (df.B > 2) & (df.C > -1)].reset_index(drop = True)

df
    A  B  C
0   2  5  2
1  10  3  1
2   3  6  2

但是,我想在一个函数中执行此操作,其中列的名称及其阈值在字典中提供给我。这是我的第一次尝试,效果很好。本质上我把过滤器放在里面cond变量并运行它:

df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
limits_dic = {"A" : 0, "B" : 2, "C" : -1}
cond = "df = df.loc["
for key in limits_dic.keys():
    cond += "(df." + key + " > " + str(limits_dic[key])+ ") & "
cond = cond[:-2] + "].reset_index(drop = True)"
exec(cond)
df
    A  B  C
0   2  5  2
1  10  3  1
2   3  6  2

现在,最后我将所有内容放入一个函数中,它停止工作(也许exec函数不喜欢在函数内部使用!):

df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
limits_dic = {"A" : 0, "B" : 2, "C" : -1}
def filtering(df, limits_dic):
    cond = "df = df.loc["
    for key in limits_dic.keys():
        cond += "(df." + key + " > " + str(limits_dic[key])+ ") & "
    cond = cond[:-2] + "].reset_index(drop = True)"
    exec(cond)
    return(df)

df = filtering(df, limits_dic)
df
    A  B  C
0   6  2 -5
1   2  5  2
2  10  3  1
3  -5  2  8
4   3  6  2

我知道exec在函数内部使用时,函数的行为有所不同,但不确定如何解决该问题。另外,我想知道必须有一种更优雅的方法来定义一个函数来执行给定两个输入的过滤:1)df and 2)limits_dic = {"A" : 0, "B" : 2, "C" : -1}。我将不胜感激对此的任何想法。


如果您尝试构建动态查询,有更简单的方法。这是一个使用列表理解和str.join:

query = ' & '.join(['{}>{}'.format(k, v) for k, v in limits_dic.items()])

或者,使用f-使用 python-3.6+ 的字符串,

query = ' & '.join([f'{k}>{v}' for k, v in limits_dic.items()])
print(query)

'A>0 & C>-1 & B>2'

将查询字符串传递给df.query,它就是为了这个目的:

out = df.query(query)
print(out)

    A  B  C
1   2  5  2
2  10  3  1
4   3  6  2

如果我的列名称有空格或其他奇怪的字符怎么办?

从 pandas 0.25 开始,您可以将列名用反引号括起来,这样就可以了:

query = ' & '.join([f'`{k}`>{v}' for k, v in limits_dic.items()])

See 这个堆栈溢出帖子 https://stackoverflow.com/questions/50697536/pandas-query-function-not-working-with-spaces-in-column-names了解更多。


你也可以使用df.eval如果您想为查询获取布尔掩码,那么索引就变得很简单:

mask = df.eval(query)
print(mask)

0    False
1     True
2     True
3    False
4     True
dtype: bool

out = df[mask]
print(out)

    A  B  C
1   2  5  2
2  10  3  1
4   3  6  2

字符串数据

如果您需要查询使用字符串数据的列,则上面的代码需要稍作修改。

考虑(数据来自这个答案 https://stackoverflow.com/a/50692578/4909087):

df = pd.DataFrame({'gender':list('MMMFFF'),
                   'height':[4,5,4,5,5,4],
                   'age':[70,80,90,40,2,3]})

print (df)
  gender  height  age
0      M       4   70
1      M       5   80
2      M       4   90
3      F       5   40
4      F       5    2
5      F       4    3

以及列、运算符和值的列表:

column = ['height', 'age', 'gender']
equal = ['>', '>', '==']
condition = [1.68, 20, 'F']

这里适当的修改是:

query = ' & '.join(f'{i} {j} {repr(k)}' for i, j, k in zip(column, equal, condition))
df.query(query)

   age gender  height
3   40      F       5

有关信息pd.eval()函数系列、其特性和用例,请访问使用 pd.eval() 在 pandas 中进行动态表达式评估 https://stackoverflow.com/questions/53779986/dynamic-expression-evaluation-in-pandas-using-pd-eval.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态过滤 pandas 数据框 的相关文章

随机推荐

  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 一个类中有多个具有相同参数类型的方法

    我知道 至少已经有了关于这个主题的一个问题 https stackoverflow com questions 5561436 can two java methods have same name with different retur
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • 为什么“round”函数对 p 值的数字不起作用?以及如何使用“gtsummary”调整汇总表中的百分比数字?

    当我创建 add p 的自定义 pvalue 函数 时 我尝试调整 p 值的数字 但发现函数 round 不起作用 参见代码 result p 此外 我发现我无法更改汇总表中计数百分比的数字 ttest1 lt function data
  • 如何在unix中移动或复制“find”命令列出的文件?

    我有使用下面的命令看到的某些文件的列表 但是如何将列出的这些文件复制到另一个文件夹 例如 test 中 find mtime 1 exec du hc 添加到 Eric Jablow 的答案中 这是一个可能的解决方案 它对我有用 linux
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 对于 Scala,“无全局类型推断”是什么意思?

    我读过 Scala 的类型推断不是全局的 因此人们必须在方法上放置类型注释 这会是 本地 类型推断吗 我只知道一点点 原因是它面向对象的本质 但我不清楚 是否有 全局类型推断 的解释以及为什么 Scala 不能让初学者可以理解 The pr
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • 如何在 Bootstrap 3 中指定行高?

    使用 Bootstrap 3 我将 row 类的高度设置为 3 5em 我在行中有几个输入 它们与行的顶部对齐 我想让它们底部对齐 我尝试过垂直对齐 底部的样式 但这似乎不起作用 我想让东西底部对齐的原因是我有一个浮动标签 我在输入字段上方
  • 使用 tf.estimator.Estimator 加载检查点和微调

    我们正在尝试将旧的训练代码转换为更符合 tf estimator Estimator 的代码 在初始代码中 我们针对目标数据集微调原始模型 在使用以下组合进行训练之前 仅从检查点加载一些层要恢复的变量 and init fn与监控培训课程
  • 如何更改phpmyadmin MySQL的IP地址?

    我在 xampp 中更改了 apache 的 IP 地址 但无法连接到 MySQL 我认为问题是我的 apache 不在我的数据库的同一网络上 我的 apache 位于 192 168 1 10 而我的 MySQL 位于 127 0 0 1
  • 用于从网格主机获取 selenium 节点状态的 API

    很抱歉问这个一般性问题 但是是否有一个 api 可用作 selenium 网格的一部分 我可以查询它以找出网格上当前的活动会话 有一个使用 Json Wire 协议的 api 可以查询各个节点以获取会话信息 但是我想知道是否有一个与网格机绑
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0