Lambda排除包含字符串列表的值

时间:2019-09-11 15:39:34

标签: python pandas lambda

如果熊猫的数据框中有某些值,我想排除它们。

excluded_url_subpath = ['/editer', '/administration', '/voir-les-transactions', '/modifier', '/diffuser', '/creation-paiement']

所以我有一个可行的解决方案,可以像这样一个接一个地完成它:

df = df[df['pagepath'].map(lambda x: False if '/editer' in x else True)]
df = df[df['pagepath'].map(lambda x: False if '/administration' in x else True)]
...

或者我可以使用我写的清单。但是我尝试了一些方法,IDE告诉我无法访问变量x

df = df[df['pagepath'].map(lambda x: False for i in excluded_url_subpath if x in i)]

这里的错误在哪里?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式,我构建了一个示例数据框:

import pandas as pd
data = {'pagepath': ['/editer', 'to_keep', 'to_delete/editer/to_delete', 'hello/voir-les-transactions', 'to_keep'], 
        'year': [2012, 2012, 2013, 2014, 2014], 
        'reports': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])
print(df)

使用先前的代码,我们构建了以下数据集:

                               pagepath  year  reports
Cochice                         /editer  2012        4
Pima                            to_keep  2012       24
Santa Cruz   to_delete/editer/to_delete  2013       31
Maricopa    hello/voir-les-transactions  2014        2
Yuma                            to_keep  2014        3

现在,我将解决方案从this answer调整到适合您的情况。首先,为了实现通用解决方案,我转义了excluded_url_subpath列表中的字符串可以包含的可能的非字母数字字符。

import re
excluded_url_subpath = ['/editer', '/administration', '/voir-les-transactions', '/modifier', '/diffuser', '/creation-paiement']
safe_excluded_url_subpath = [re.escape(m) for m in excluded_url_subpath]

现在,使用contains函数,我使用|构建了一个正则表达式,将您的列表加入其中:

df[~df.pagepath.str.contains('|'.join(safe_excluded_url_subpath))]

我获得了以下数据框:

     pagepath  year  reports
Pima  to_keep  2012       24
Yuma  to_keep  2014        3

答案 1 :(得分:1)

您可以通过过滤数据框来做到这一点,例如:

const jsonServer = require('json-server');
const server = jsonServer.create();
const _ = require('lodash')
const router = jsonServer.router('./db.json');
const middlewares = jsonServer.defaults();
const port = process.env.PORT || 3000;

server.use(middlewares);
server.use(jsonServer.bodyParser)
server.use(jsonServer.rewriter({
    '/api/products': '/products'
}));

server.post('/api/productcollection', (req, res) => {
    const db = router.db; // Assign the lowdb instance

    if (Array.isArray(req.body)) {
        req.body.forEach(element => {
            insert(db, 'products', element); // Add a post
        });
    }
    else {
        insert(db, 'products', req.body); // Add a post
    }
    res.sendStatus(200)

    /**
     * Checks whether the id of the new data already exists in the DB
     * @param {*} db - DB object
     * @param {String} collection - Name of the array / collection in the DB / JSON file
     * @param {*} data - New record
     */
    function insert(db, collection, data) {
        const table = db.get(collection);
        if (_.isEmpty(table.find(data).value())) {
            table.push(data).write();
        }
    }
});

server.use(router);
server.listen(port);