熊猫:通过|过滤行(或) - 不相互包容

时间:2015-06-25 13:21:11

标签: python python-2.7 pandas

我正在寻找一种通过字符串中的替代方法过滤pandas行的方法。我想要搜索许多不同的术语,因此将它们放在一些变量中会更容易,而不是每次我需要访问它们时都列出它们。

我目前正在做:

df = df[df["A"].str.contains("BULL|BEAR|LONG|SHORT", case=False)]

取而代之的是:

bull = "BULL|LONG"
bear = "BEAR|SHORT"
leverage = bull + bear

df = df[df["A"].find(leverage, case=False)]

问题是此方法仅从每个变量中过滤掉一个备选方案。它会找到"BULL"但不会找到"LONG",它会找到"SHORT"但不会找到"BEAR"。它似乎选择的是任意的。根据我正在阅读的文件中这些术语的出现位置和位置,结果可能会有所不同。

我假设这是由于|函数OR是互斥的。

如果是这样,是否有相互包容的选择?我想继续使用 strings 来做到这一点。原因是我在另一个依赖相同变量的地方使用str.contains

df.loc[df["A"].str.contains(bull, case=False), "B"]
df.loc[df["A"].str.contains(bear, case=False), "B"]

1 个答案:

答案 0 :(得分:1)

您需要添加额外的'|'才能加入您的条款:

In [227]:
df = pd.DataFrame({'A':['bull', 'bear', 'short', 'null', 'LONG']})
df

Out[227]:
       A
0   bull
1   bear
2  short
3   null
4   LONG

In [228]:    
bull = "BULL|LONG"
bear = "BEAR|SHORT"
leverage = bull + '|' + bear
df = df[df["A"].str.contains(leverage, case=False)]
df

Out[228]:
       A
0   bull
1   bear
2  short
4   LONG