我的数据框如下:
<script>
Vue.component("c", {template: `<div>is c</div>`})
new Vue({el: "#app"})
$("#app").append(`<c></c>`)
new Vue({el: "#app"})
</script>
我希望有一个灵活的选择,使用字符串来过滤掉某些记录。类似的东西:
import pandas as pd
df1 = pd.DataFrame({'Counterparty':['Bank','Client','Bank','Bank'],
'Amount':[100, 100, 100, 100]
})
我正在努力如何使用Counterparty = Bank选择 NOT 的所有记录。即
condition ="'Bank'"
result = "df1['Counterparty'].isin(["+condition+"])"
print(eval(result))
我有什么建议可以实现这个目标吗?
答案 0 :(得分:2)
您可以使用一元操作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
答案 1 :(得分:1)
首先使用eval is bad practice。
如何使用query
?
condition ="Bank"
result = df1.query('Counterparty not in @condition')
print (result)
Amount Counterparty
1 100 Client
答案 2 :(得分:1)
Pandas有字符串操作,可以使用&#34; str&#34;。
来访问<div class="bookmarks delete">CLICK (contains "delete" class)</div>
<div class="bookmarks">CLICK (doesn't contain "delete" class)</div>
找到银行可以做到这一点。
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')
其他一些说明。不要尝试构建需要评估的表达式(只需忘记eval有一段时间)
答案 3 :(得分:0)
不要以这种方式使用eval
,这会带来安全风险。
至少有两个可行的选择:
df.query
,as explained by @jezrael。pandasql
之类的第三方库,可以让您应用类似SQL的查询,例如pysqldf("SELECT * FROM df WHERE Counterparty <> 'bank';")