Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python isin的复杂操作_Python_Python 3.x_Pandas - Fatal编程技术网

Python isin的复杂操作

Python isin的复杂操作,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据框,看起来像: import pandas as pd df1 = pd.DataFrame({'Counterparty':['Bank','Client','Bank','Bank'], 'Amount':[100, 100, 100, 100] }) 我希望有一个灵活的选择,使用字符串过滤掉某些记录。比如: condition ="'Bank'" result = "df1['Counterparty'].isin(["+co

我有一个数据框,看起来像:

import pandas as pd
df1 = pd.DataFrame({'Counterparty':['Bank','Client','Bank','Bank'],
             'Amount':[100, 100, 100, 100]
            })
我希望有一个灵活的选择,使用字符串过滤掉某些记录。比如:

condition ="'Bank'"
result = "df1['Counterparty'].isin(["+condition+"])"
print(eval(result))
我正在努力选择与交易对手=银行无关的所有记录。即

condition ="Not("Bank"))"
有什么建议可以实现吗?

首先使用

使用呢


您可以按如下方式使用一元运算Not~

condition ="'Bank'"
result = "df1[~df1['Counterparty'].isin(["+condition+"])]"
print(eval(result))
输出将是:

   Amount Counterparty
1     100       Client
编辑
Pandas具有可以使用str访问的字符串操作

import pandas as pd
df1 = pd.DataFrame({'Counterparty':['Bank','Client','Bank','Bank'],
             'Amount':[100, 100, 100, 100]
            })
要找到银行,你可以这样做

df1.Counterparty.str.match('Bank')
如果要查找除以下内容以外的任何内容,请添加平铺:

~df1.Counterparty.str.match('Bank')
最后,如果需要数据,只需将此布尔查询放入

df1[~df1.Counterparty.str.match('Bank')]
还有一些其他的注释。不要试图构建需要计算的表达式,只是暂时忘记eval的存在

不要以这种方式使用eval,它会带来安全风险

至少有两种可行的选择:

使用df.query。 使用类似的第三方库,这将允许您应用类似SQL的查询,例如,来自交易对手“银行”的df的pysqldfSELECT*;
我不想让它成为条件的一部分。通过这种方式,我可以灵活地更改过滤条件,而不必更改代码。我认为这是一个问题。因为条件变量不是条件,而是经过筛选的字符串。因此不能使用condition=NotBank。因为condition都是字符串df1['contractor']。isin[+condition+]我希望结果是灵活的。结果应仅取决于条件。如果我通过了Not条件,结果应该反映这一点。同样,如果我只是通过了条件银行,它应该只向我显示与银行交易对手的记录。但是,没有直接的方法可以做到这一点。我已经编辑了我的帖子,其中有一条建议是“黑客”,但如果条件似乎是解决这个问题的唯一方法,它就会起作用!谢谢
~df1.Counterparty.str.match('Bank')
df1[~df1.Counterparty.str.match('Bank')]