【问题标题】:Apply filtering conditions from a file and parse it to pandas dataframe应用文件中的过滤条件并将其解析为 pandas 数据框
【发布时间】:2021-08-10 02:46:43
【问题描述】:

假设我们有这样的数据框

import pandas as pd
dataFrame = pd.DataFrame({'Name': [' RACHEL  ', ' MONICA  ', ' PHOEBE  ',
                               '  ROSS    ', 'CHANDLER', ' JOEY    '],
                        
                      'Age val': [30, 35, 37, 33, 34, 30],
                        
                      'Salary val': [100000, 93000, 88000, 120000, 94000, 95000],
                        
                      'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
                              'IT', 'ARTIST']})

并拥有包含过滤条件的 csv 文件

我想遍历 csv 文件并将“和”条件放在“过滤公式”行值之间。将它们连接并解析为pandasdataframe

   filters = ''
        
        for i, cols in csv_file.iterrows():
            
            formula = cols['Filter_Formula']
            filters = filters.join(formula + "&")
        print(filters)

当我打印“过滤器”时,我得到了

ASalary val<= 100000&gSalary val<= 100000&eSalary val<= 100000& Salary val<= 100000&vSalary val<= 100000&aSalary val<= 100000&lSalary val<= 100000& Salary val<= 100000&>Salary val<= 100000& Salary val<= 100000&3Salary val<= 100000&5Salary val<= 100000&&

但我想得到的是

    dataFrame= dataFrame[dataFrame.eval(filters)]

filters 在哪里

    "Salary val <=100000 & (Age val > 35"

我该怎么做? 谢谢

【问题讨论】:

    标签: python pandas filter eval


    【解决方案1】:

    我们可以通过在分隔符&amp; 周围连接Filter_Formula 列中的字符串来构造查询表达式。注意:由于列名包含空格,我们需要用反引号将列名括起来以构造一个有效的查询表达式

    df.query('&'.join(f.replace(n, f'`{n}`') for n, f in csv_file.to_numpy()))
    

          Name    Age val  Salary val    JOB
    2   PHOEBE         37       88000  MASUS
    

    【讨论】:

    • 你能展示你是如何得到“过滤器”的吗?因为我也遇到了麻烦!
    • 检查编辑,以前它被用作csv_file 的别名。现在,我已将其删除以避免混淆。
    • 你的意思是 csv_file['Filter_Formula'].非常感谢!
    • @Alexander 假设csv_file 中有两列,我们可以简单地在列表推导中使用csv_file.to_numpy() 来遍历列名和公式对。
    • @Shubnam Sharma 如果我们有两个以上的列怎么办?运行相同的代码时出现错误!检查 OP 中的编辑!
    猜你喜欢
    • 2020-01-24
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2020-08-29
    • 1970-01-01
    • 2020-05-17
    • 2017-02-23
    相关资源
    最近更新 更多