pandas 在其他列中的任意位置查找子字符串

2hh7jdfx  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(136)

我在列a中有字符串。我想搜索列b中的所有行,看看a中的每个值是否在b中的某个地方找到

import pandas as pd

data = {"a":["hi","hello","yes","xyz"],
        "b":["asdfHI", "qwertHello","nononoXYZ", "OKOK"]}
df = pd.DataFrame(data)

#        a           b
# 0     hi      asdfHI
# 1  hello  qwertHello
# 2    yes   nononoXYZ
# 3    xyz        OKOK

#hi, hello and xyz is somewhere in b. Yes isnt. I want to create the found column:

#        a           b      found
# 0     hi      asdfHI      True
# 1  hello  qwertHello      True
# 2    yes   nononoXYZ      False
# 3    xyz        OKOK      True

#This only search rowwise so xyz isnt found:
df.apply(lambda x: x.a.lower() in x.b.lower(), axis=1)
# 0     True
# 1     True
# 2    False
# 3    False

#[aval.lower() in df.b.str.lower() for aval in df.a]
#[False, False, False, False]

#df.b.str.lower().str.contains(df.a.str.lower())
#TypeError: unhashable type: 'Series'

#df.b.str.contains(df.a.str, case=False)
#TypeError: first argument must be string or compiled pattern

字符串

anauzrmj

anauzrmj1#

你可以在any中使用列表解析:

B = df['b'].str.lower()
df['found'] = [any(a in b for b in B) for a in df['a'].str.lower()]

字符串
或者,用一个分隔符连接b,你知道这个分隔符将不存在,并使用一个简单的in(这可能效率较低):

B = '||'.join(df['b'].str.lower())
df['found'] = [a in B for a in df['a'].str.lower()]


输出量:

a           b  found
0     hi      asdfHI   True
1  hello  qwertHello   True
2    yes   nononoXYZ  False
3    xyz        OKOK   True

zf2sa74q

zf2sa74q2#

另一种可能的选择是使用numpybroadcastingchar.find

words = df.to_numpy(dtype="str")

check = ~np.all(np.char.find(
    np.char.lower(words[:, 1, None]),
    np.char.lower(words[:, 0])) == -1, axis=0)

df["a in whole-b"] = check

字符串
或者这个变体可以使用str.cat/lower和成员操作(usingin):

df["a in whole-b"] = [a.lower() in df["b"].str.cat().lower() for a in df["a"]]


输出量:

print(df)

       a           b  a in whole-b
0     hi      asdfHI          True
1  hello  qwertHello          True
2    yes   nononoXYZ         False
3    xyz        OKOK          True


一个perfplot(of ~ 10 k rows):
NumPy的方法在非常小的数据上是有效的,而@mozway的方法在较大的数据上是最快的。
x1c 0d1x的数据

相关问题