在同一列的多个字符串条件下过滤行

时间:2019-09-13 13:56:42

标签: python pandas dataframe

我想在多个条件下过滤数据框。假设我有一列称为“详细信息”的列,我想获取一个数据框,其中“详细信息”列的值与以下内容匹配:

detail = unidecode.unidecode(str(row['detail']).lower())

所以现在我所有detail行都未解码且小写,然后我要提取以某些子字符串开头的行:

detail.startswith('bomb')

最后还要取另一个整数列等于100的行。

我试图这样做,但显然不起作用:

llista_dfs['df_bombes'] = df_filtratge[df_filtratge['detail'].str.lower().startswith('bomb') or df_filtratge['family']==100]

上面的这一行是我想要执行的,但是我不确定哪种代码可以在一行代码中实现(如果可能的话)。

这是代码应执行的示例:

初始表格

    detail            family
0   bòmba             90
1   boMbá             87
2   someword          100
3   someotherword     65
4   Bombá             90

结果表:

    detail             family
0   bòmba              90
1   boMbá              87
2   someword           100
4   Bombá              90

1 个答案:

答案 0 :(得分:1)

@ user3483203的注释实际上是正确的解决方案,因为它可以过滤您使用&|而不是andor的熊猫。无论如何,如果您想摆脱unidecode,可以使用以下解决方案:

import pandas as pd

txt="""0   bòmba             90
1   boMbá             87
2   someword          100
3   someotherword     65
4   Bombá             90"""

df = [list(filter(lambda x: x!='', t.split(' ')))[1:] 
      for t in txt.split("\n")]

df = pd.DataFrame(df, columns=["details", 'family'])
df["family"] = df["family"].astype(int)

cond1 = df["details"].str.normalize('NFKD')\
                     .str.encode('ascii', errors='ignore')\
                     .str.decode('utf-8')\
                     .str.lower()\
                     .str.startswith('bomba')

cond2 = df["family"]==100

df[cond1 | cond2]