Проверьте, начинается ли строка в столбце со строки в другом столбце

#pandas #dataframe

Вопрос:

Я пытаюсь проверить, начинается ли строка в одном столбце со строки в другом столбце примерно так:

 gt;gt;gt; import pandas as pd gt;gt;gt; gt;gt;gt; df = pd.DataFrame( {'A': ['Sam', 'Ham', 'Pam'], 'B': ['Samuelson', 'Mike', 'Pamela']}) gt;gt;gt; df  A B 0 Sam Samuelson 1 Ham Mike 2 Pam Pamela  gt;gt;gt; df.B.str.startswith(df.A) 0 NaN 1 NaN 2 NaN Name: B, dtype: float64 gt;gt;gt;   

По-видимому, это не работает. Кто-нибудь знает, как выполнить такого рода сравнение строк?

Ответ №1:

Вы можете использовать apply :

 df.apply(lambda row: row['B'].startswith(row['A']), axis=1)  

что дает:

 0 True 1 False 2 True dtype: bool  

или просто перечислите понимание zip здесь:

 [y.startswith(x) for x,y in zip(df['A'], df['B'])]  

Если вам нужны новые столбцы:

 df['C'] = [y.startswith(x) for x,y in zip(df['A'], df['B'])]  

Выход:

 A B C 0 Sam Samuelson True 1 Ham Mike False 2 Pam Pamela True  

Ответ №2:

Вы можете использовать трюк: объединить A и B и использовать регулярное выражение:

 df['C'] = (df['A'] '%' df['B']).str.match(r'^(. )%1')  

выход:

 A B C 0 Sam Samuelson True 1 Ham Mike False 2 Pam Pamela True  

Комментарии:

1. Работает ли A это a%a , если да ?

2. @QuangHoang учитывая контекст (имена) Я думаю, что это вряд ли произойдет 😉 вы всегда можете выбрать что-то более сложное. Я предусмотрел этот трюк, так как он намного быстрее, чем apply

Ответ №3:

 df["C"] = list(map(lambda a, b: a == b[:len(a)], df.A, df.B)) df # A B C # 0 Sam Samuelson True # 1 Ham Mike False # 2 Pam Pamela True  

или

 def foo(a, b):  return b.startswith(a)  np.vectorize(foo)(df.A, df.B)