用isin操纵复杂的大熊猫

问题描述 投票:2回答:4

我有一个看起来像这样的数据框:

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

有什么建议我怎么能做到这一点?

python python-3.x pandas
4个回答
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
投票

首先使用eval is bad practice

那么使用query呢?

condition ="Bank"
result = df1.query('Counterparty not in @condition')
print (result)
   Amount Counterparty
1     100       Client

1
投票

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有一段时间)


0
投票

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

至少有两个可行的选择:

  1. 使用df.queryas explained by @jezrael
  2. 使用像pandasql这样的第三方库,它可以让您应用类似SQL的查询,例如: pysqldf("SELECT * FROM df WHERE Counterparty <> 'bank';")
© www.soinside.com 2019 - 2024. All rights reserved.