在pandas中搜索多个字符串而不预先确定要使用的字符串数

use*_*418 12 python pandas

我想知道是否有更通用的方法来做下面的事情?我想知道是否有办法创建st函数,以便我可以搜索非预定义数量的字符串?

例如,能够创建一个通用的st函数,然后输入st('Governor','Virginia','Google)

这是我当前的功能,但它预定义了两个可以使用的单词.(df是一个pandas DataFrame)

def search(word1, word2, word3 df):
    """
    allows you to search an intersection of three terms
    """
    return df[df.Name.str.contains(word1) & df.Name.str.contains(word2) & df.Name.str.contains(word3)]

st('Governor', 'Virginia', newauthdf)
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 15

你可以使用np.logical_and.reduce:

import pandas as pd
import numpy as np
def search(df, *words):  #1
    """
    Return a sub-DataFrame of those rows whose Name column match all the words.
    """
    return df[np.logical_and.reduce([df['Name'].str.contains(word) for word in words])]   # 2


df = pd.DataFrame({'Name':['Virginia Google Governor',
                           'Governor Virginia',
                           'Governor Virginia Google']})
print(search(df, 'Governor', 'Virginia', 'Google'))
Run Code Online (Sandbox Code Playgroud)

版画

                       Name
0  Virginia Google Governor
2  Governor Virginia Google
Run Code Online (Sandbox Code Playgroud)
  1. *def search(df, *words)允许search接受的位置参数的数量不受限制.它将收集所有参数(在第一个之后)并将它们放在一个名为的列表中words.
  2. np.logical_and.reduce([X,Y,Z])相当于X & Y & Z.但是,它允许您处理任意长的列表.


beh*_*uri 15

str.contains可以采取正则表达式.所以你可以'|'.join(words)用作模式; 也是安全的地图re.escape:

>>> df
                 Name
0                Test
1            Virginia
2              Google
3  Google in Virginia
4               Apple

[5 rows x 1 columns]
>>> words = ['Governor', 'Virginia', 'Google']
Run Code Online (Sandbox Code Playgroud)

'|'.join(map(re.escape, words)) 将是搜索模式:

>>> import re
>>> pat = '|'.join(map(re.escape, words))
>>> df.Name.str.contains(pat)
0    False
1     True
2     True
3     True
4    False
Name: Name, dtype: bool
Run Code Online (Sandbox Code Playgroud)