用isin操纵复杂的大熊猫

时间:2018-02-18 09:48:43

标签: python python-3.x pandas

我的数据框如下:

<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))

我有什么建议可以实现这个目标吗?

4 个答案:

答案 0 :(得分:2)

您可以使用一元操作Not(〜),如下所示

condition ="'Bank'"
result = "df1[~df1['Counterparty'].isin(["+condition+"])]"
print(eval(result))

输出将是:

   Amount Counterparty
1     100       Client

## EDIT

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,这会带来安全风险。

至少有两个可行的选择:

  1. 使用df.queryas explained by @jezrael
  2. 使用pandasql之类的第三方库,可以让您应用类似SQL的查询,例如pysqldf("SELECT * FROM df WHERE Counterparty <> 'bank';")