pandas按两个列值过滤行,不区分大小写

时间:2017-09-25 16:09:11

标签: python pandas

我有一个简单的数据框如下:

Last Known Date ConfigredValue  ReferenceValue
0   24-Jun-17   False   FALSE
1   25-Jun-17   FALSE   FALSE
2   26-Jun-17   TRUE    FALSE
3   27-Jun-17   FALSE   FALSE
4   28-Jun-17   false   FALSE

如果我执行以下命令

df=df[df['ConfigredValue']!=dfs['ReferenceValue']]

然后我得到如下

0   24-Jun-17   False   FALSE
2   26-Jun-17   TRUE    FALSE
4   28-Jun-17   false   FALSE

但我希望过滤器不区分大小写(case = False)

我想要关注输出:

2   26-Jun-17   TRUE    FALSE

请建议,如何获取过滤不区分大小写的数据(case = false)

4 个答案:

答案 0 :(得分:3)

选项1:转换为较低或较高并比较

最简单的方法是在检查相等性之前将两列转换为低位(或高位):

df=df[df['ConfigredValue'].str.lower()!=df['ReferenceValue'].str.lower()]

df=df[df['ConfigredValue'].str.upper()!=df['ReferenceValue'].str.upper()]

输出:

Out: 
  Last Known Date ConfigredValue ReferenceValue
2    2  26-Jun-17           TRUE          FALSE

选项2:比较长度

在这个特殊情况下,您可以简单地比较TRUE和True的长度,它们与字符串大写或小写相同:

df[df['ConfigredValue'].str.len()!=df['ReferenceValue'].str.len()]

输出:

Out: 
  Last Known Date ConfigredValue ReferenceValue
2    2  26-Jun-17           TRUE          FALSE

选项3:矢量化标题

在@ 0p3n5ourcE回答中也提出了

str.title(),这里是它的矢量化版本:

df[df['ConfigredValue'].str.title()!=df['ReferenceValue'].str.title()]

执行时间

对速度进行基准测试表明str.len()更快一点

In [35]: timeit df[df['ConfigredValue'].str.lower()!=df['ReferenceValue'].str.lower()]
1000 loops, best of 3: 496 µs per loop

In [36]: timeit df[df['ConfigredValue'].str.upper()!=df['ReferenceValue'].str.upper()]
1000 loops, best of 3: 496 µs per loop

In [37]: timeit df[df['ConfigredValue'].str.title()!=df['ReferenceValue'].str.title()]
1000 loops, best of 3: 495 µs per loop

In [38]: timeit df[df['ConfigredValue'].str.len()!=df['ReferenceValue'].str.len()]
1000 loops, best of 3: 479 µs per loop

答案 1 :(得分:3)

最好用' FALSE'使用case = False参数即

df['ConfigredValue'] = df['ConfigredValue'].str.replace('false','FALSE',case=False)

df=df[df['ConfigredValue']!=df['ReferenceValue']]

输出:

   Last Known_Date ConfigredValue ReferenceValue
2     2  26-Jun-17           TRUE          FALSE

答案 2 :(得分:2)

看起来这些列包含#! /usr/bin/env node var shell = require('shelljs'); var userArgs = process.argv.slice(2); var folderName = userArgs[0]; var Spinner = require('cli-spinner').Spinner; var depSpin = new Spinner('Installing dependencies.. %s'); var spawn = require('child_process').spawn; var commandsDep = [ 'cd ' + folderName, 'npm init -y', 'npm install --save babel-core babel-loader babel-preset-es2015 babel-preset-react react-dom react-redux redux webpack', 'npm install --save-dev babel-preset-env webpack-dev-server' ]; var depChild = spawn(commandsDep.join(' && '), { shell: true }); depSpin.setSpinnerString(18); shell.mkdir(folderName); shell.cd(folderName); depSpin.start(); depChild.on('exit', () => { depSpin.stop(); shell.exec('clear'); console.log('Installing dependencies.. ✓'); }) shell.touch('webpack.config.js'); shell.mkdir(['build', 'frontend']); shell.cd('frontend'); shell.mkdir(['components', 'containers', 'reducers', 'store']); shell.touch('app.js'); shell.cd('containers'); shell.touch(['AppContainer.js', 'Root.js']); shell.cd('../reducers'); shell.touch('index.js'); shell.cd('../store'); shell.touch('configureStore.js'); 值,如果将列转换为boolean数据类型不是问题,那么以下也可以正常工作(其中boolean用于将字符串的第一个字符更改为大写,例如将FALSE更改为False,或将true更改为True,然后将其转换为相应的布尔值):

.title()

然后,使用与上面相同的比较:

df['ConfigredValue'] = df['ConfigredValue'].apply(lambda row: eval(row.title()))
df['ReferenceValue'] = df['ReferenceValue'].apply(lambda row: eval(row.title()))

输出:

df[df['ConfigredValue'] != df['ReferenceValue']]

或者,只使用类似于大写或小写的标题:

    Last Known Date  ConfigredValue  ReferenceValue
2       26-Jun-17            True           False

答案 3 :(得分:1)

在框外
pandas.read_csv以布尔值的形式读取所有这些内容。您可以转储到csv并再次读取它。然后,您可以使用pd.DataFrame.query

pd.read_csv(pd.io.common.StringIO(df.to_csv(index=False))).query(
    'ConfigredValue != ReferenceValue')

  Last Known Date  ConfigredValue  ReferenceValue
2       26-Jun-17            True           False