我想在多个条件下过滤数据框。假设我有一列称为“详细信息”的列,我想获取一个数据框,其中“详细信息”列的值与以下内容匹配:
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
答案 0 :(得分:1)
@ user3483203的注释实际上是正确的解决方案,因为它可以过滤您使用&
和|
而不是and
和or
的熊猫。无论如何,如果您想摆脱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]