Python 使用列表使用正则表达式筛选数据帧
我有以下列的数据框架:Hello,World,Python,Hello_X,World_X,Python_X 还有,我有这个列表:[“你好”,“世界”] 使用该列表,我想过滤数据帧并保留以下列:Hello,World,Hello_X,World_X 请注意,我在实际数据框中有数千列,因此请不要提供手动解决方案。Python 使用列表使用正则表达式筛选数据帧,python,pandas,Python,Pandas,我有以下列的数据框架:Hello,World,Python,Hello_X,World_X,Python_X 还有,我有这个列表:[“你好”,“世界”] 使用该列表,我想过滤数据帧并保留以下列:Hello,World,Hello_X,World_X 请注意,我在实际数据框中有数千列,因此请不要提供手动解决方案。 您可以创建一个正则表达式字符串,如Hello | World |。。。自动从您正在搜索的单词列表中选择,然后使用过滤器应用它: 检查此正则表达式对象 方法1 方法2 输出: Column
您可以创建一个正则表达式字符串,如Hello | World |。。。自动从您正在搜索的单词列表中选择,然后使用过滤器应用它:
检查此正则表达式对象 方法1 方法2 输出:
Columns: [Hello, World, Hello_X, World_X]
我建议使用一个改进的正则表达式来解决这个问题,它将采用列名和名称,加上所需的下划线,再加上一些不仅仅是“X”字母的内容。regexp将不匹配以相同方式开始的名称,并且需要在所需名称后面加下划线+任何内容
import numpy as np
import pandas as pd
import re
df = pd.DataFrame( np.array(([1, 2, 3, 4, 5, 6, 7], [11, 12, 13, 14, 15, 16, 17] )),
columns=['Hello', 'World', 'Python', 'Hellow', 'Hello_X', 'World_X', 'Python_X'])
cols = ['Hello', 'World']
### building the regexp to match either column names or columns names with one '_' and something after
regex = ['(^'+x+'(_.*)+)' for x in cols] + ['(^'+x+'$)' for x in cols]
regex = r'|'.join(regex)
print(df.filter(regex=regex))
但是要小心,如果所选列的名称中包含|,则此选项可能会中断。如果是这种情况,则|必须用\ |在cols中转义;如果所选列的名称以相同的字母开头,则此选项可能会中断。见鬼,你好,你两个都不要。regexp可以改进。OP应该提供更多关于这方面的详细信息。让我们等待他会告诉我们什么。是的,确切地说,没有更清楚的意图,我们只能假设我allready在第一行提到改变regex对象不要说我认为“X”应该是什么?而不仅仅是“X”。。所以最好在regexp中使用“.*?”请显示一段代码,X是什么?只是“X”字母还是什么?在我下面的答案中,我认为与X完全匹配的是任何东西。
import numpy as np
import pandas as pd
import re
df = pd.DataFrame(columns=['Hello', 'World', 'Python', 'Hello_X', 'World_X', 'Python_X'])
regex=re.compile(r'(Hello(_X)?|World(_X)?)')
up_col = [i for i in df.columns if regex.search(i)]
df[up_col]
Columns: [Hello, World, Hello_X, World_X]
import numpy as np
import pandas as pd
import re
df = pd.DataFrame( np.array(([1, 2, 3, 4, 5, 6, 7], [11, 12, 13, 14, 15, 16, 17] )),
columns=['Hello', 'World', 'Python', 'Hellow', 'Hello_X', 'World_X', 'Python_X'])
cols = ['Hello', 'World']
### building the regexp to match either column names or columns names with one '_' and something after
regex = ['(^'+x+'(_.*)+)' for x in cols] + ['(^'+x+'$)' for x in cols]
regex = r'|'.join(regex)
print(df.filter(regex=regex))