#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)