如何根据字符串和特殊字符过滤pd.Dataframe?
How to filter pd.Dataframe based on strings and special characters?
这是我的:
import re
import pandas as pd
d = {'ID': [1, 2, 3, 4, 5], 'Desc': ['0*1***HHCM', 'HC:83*20', 'HC:5*2CASL', 'DM*72\nCAS*', 'HC:564*CAS*5']}
df = pd.DataFrame(data=d)
df
Output:
ID Desc
0 1 0*1***HHCM
1 2 HC:83*20
2 3 HC:5*2CASL
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
我需要按列 "Desc" 过滤数据框,如果它包含未被字母或数字包围的 "CAS" 或 "HC"。
这是我尝试过的:
new_df = df[df['Desc'].str.match(r'[^A-Za-z0-9]CAS[^A-Za-z0-9]|[^A-Za-z0-9]HC[^A-Za-z0-9]') == True]
它return是一个空数据框。
我想要return以下内容:
ID Desc
1 2 HC:83*20
2 3 HC:5*2CASL
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
另一件事:由于第3行有“\nCas”,其中“\n”是行分隔符,它会把它当作"CAS"之前的字母吗?
请帮忙。
你可以试试这个,它只检查 CAS 和 HC 之前的数字和字母,但你也可以轻松地将其修改为:
print(df[~df['Desc'].str.contains('([0-9a-zA-Z]+CAS*)|([0-9a-zA-Z]+HC*)', regex=True)])
ID Desc
1 2 HC:83*20
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
试试这个:
df.loc[df['Desc'].str.contains(r'(\W|^)(HC|CAS)(\W|$)', flags=re.M)]
# If you don't want to import re you can just use flags=8:
df.loc[df['Desc'].str.contains(r'(\W|^)(HC|CAS)(\W|$)', flags=8)]
结果:
ID Desc
1 2 HC:83*20
2 3 HC:5*2CASL
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
回答你的另一个问题,只要 \n
正确传递,它将被解析为换行符而不是字母数字字符 n
。即:
r'\n' -> `\n` (backslash character + n character)
'\n' -> '\n' (newline character)
关于regex的更多解释,请看Regex101演示:https://regex101.com/r/FNBgPV/2
这是我的:
import re
import pandas as pd
d = {'ID': [1, 2, 3, 4, 5], 'Desc': ['0*1***HHCM', 'HC:83*20', 'HC:5*2CASL', 'DM*72\nCAS*', 'HC:564*CAS*5']}
df = pd.DataFrame(data=d)
df
Output:
ID Desc
0 1 0*1***HHCM
1 2 HC:83*20
2 3 HC:5*2CASL
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
我需要按列 "Desc" 过滤数据框,如果它包含未被字母或数字包围的 "CAS" 或 "HC"。
这是我尝试过的:
new_df = df[df['Desc'].str.match(r'[^A-Za-z0-9]CAS[^A-Za-z0-9]|[^A-Za-z0-9]HC[^A-Za-z0-9]') == True]
它return是一个空数据框。
我想要return以下内容:
ID Desc
1 2 HC:83*20
2 3 HC:5*2CASL
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
另一件事:由于第3行有“\nCas”,其中“\n”是行分隔符,它会把它当作"CAS"之前的字母吗?
请帮忙。
你可以试试这个,它只检查 CAS 和 HC 之前的数字和字母,但你也可以轻松地将其修改为:
print(df[~df['Desc'].str.contains('([0-9a-zA-Z]+CAS*)|([0-9a-zA-Z]+HC*)', regex=True)])
ID Desc
1 2 HC:83*20
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
试试这个:
df.loc[df['Desc'].str.contains(r'(\W|^)(HC|CAS)(\W|$)', flags=re.M)]
# If you don't want to import re you can just use flags=8:
df.loc[df['Desc'].str.contains(r'(\W|^)(HC|CAS)(\W|$)', flags=8)]
结果:
ID Desc
1 2 HC:83*20
2 3 HC:5*2CASL
3 4 DM*72\nCAS*
4 5 HC:564*CAS*5
回答你的另一个问题,只要 \n
正确传递,它将被解析为换行符而不是字母数字字符 n
。即:
r'\n' -> `\n` (backslash character + n character)
'\n' -> '\n' (newline character)
关于regex的更多解释,请看Regex101演示:https://regex101.com/r/FNBgPV/2