Python 熊猫开始在两列之间操作

Python 熊猫开始在两列之间操作,python,pandas,string,vectorization,Python,Pandas,String,Vectorization,我有一个包含两列的数据框,我需要检查a列的每一行的值是一个字符串,该字符串以B列或a列对应行的值开始 似乎Series方法.str.startswith无法处理矢量化输入,因此我需要在列表理解中压缩这两列,并创建一个新的pd.Series,其索引与这两列中的任何一列相同 我希望这是一个矢量化的操作,可以使用.str访问器对iterables进行操作,但类似这样的操作会返回NaN: df = pd.DataFrame(data={'a':['x','yy'], 'b':['xyz','uvw']}

我有一个包含两列的数据框,我需要检查a列的每一行的值是一个字符串,该字符串以B列或a列对应行的值开始

似乎Series方法
.str.startswith
无法处理矢量化输入,因此我需要在列表理解中压缩这两列,并创建一个新的
pd.Series
,其索引与这两列中的任何一列相同

我希望这是一个矢量化的操作,可以使用
.str
访问器对iterables进行操作,但类似这样的操作会返回NaN:

df = pd.DataFrame(data={'a':['x','yy'], 'b':['xyz','uvw']})
df['a'].str.startswith(df['b'])
我的工作解决方案如下:

pd.Series(index=df.index, data=[a.startswith(b) or b.startswith(a) for a,b in zip(df['a'],df['b'])])
我怀疑可能有更好的方法来解决这个问题,因为它也会使series上的所有字符串方法受益


有没有更漂亮或更有效的方法可以做到这一点?

一个想法是使用
np.vecorize
,但因为使用字符串的性能只比您的解决方案好一点:

def fun (a,b):
    return a.startswith(b) or b.startswith(a)

f = np.vectorize(fun)
a = pd.Series(f(df['a'],df['b']), index=df.index)
print (a)
0     True
1    False
dtype: bool


df = pd.DataFrame(data={'a':['x','yy'], 'b':['xyz','uvw']})
df = pd.concat([df] * 10000, ignore_index=True)

In [132]: %timeit pd.Series(index=df.index, data=[a.startswith(b) or b.startswith(a) for a,b in df[['a', 'b']].to_numpy()])
42.3 ms ± 516 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [133]: %timeit pd.Series(f(df['a'],df['b']), index=df.index)
9.81 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [134]: %timeit pd.Series(index=df.index, data=[a.startswith(b) or b.startswith(a) for a,b in zip(df['a'],df['b'])])
14.1 ms ± 262 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
#sammywemmy solution
In [135]: %timeit pd.Series([any((a.startswith(b), b.startswith(a))) for a, b in df.to_numpy()], index=df.index)
46.3 ms ± 683 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)