我有一个看起来像这样的数据框:
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))
我正在努力如何选择所有不与Counterparty = Bank的记录。即
condition ="Not("Bank"))"
有什么建议我怎么能做到这一点?
您可以使用一元操作Not(〜),如下所示
condition ="'Bank'"
result = "df1[~df1['Counterparty'].isin(["+condition+"])]"
print(eval(result))
输出将是:
Amount Counterparty
1 100 Client
condition ="NOT(Bank)"
def func(c):
if c.startswith("NOT("):
return df1[~df1['Counterparty'].isin([c[4:-1]])]
else:
return df1[df1['Counterparty'].isin([c])]
result = "func(condition)"
print(eval(result))
condition = "Bank"
print(eval(result))
Amount Counterparty
1 100 Client
Amount Counterparty
0 100 Bank
2 100 Bank
3 100 Bank
首先使用eval is bad practice。
那么使用query
呢?
condition ="Bank"
result = df1.query('Counterparty not in @condition')
print (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
,as explained by @jezrael。pandasql
这样的第三方库,它可以让您应用类似SQL的查询,例如: pysqldf("SELECT * FROM df WHERE Counterparty <> 'bank';")