Создайте помощника Series
из вашей строки и используйте логические логики c для фильтрации:
s1 = pd.Series(list(s), index=[f'c{x+1}' for x in range(len(s))])
# print(s1)
# c1 H
# c2 K
# c3 g
# c4 5
# dtype: object
Лог c равен df
равно (==
) этому значению ИЛИ (|
) равно nan (isna
)
Используйте all
вдоль оси 1, чтобы получить строки, в которых все значения равны True
df.loc[((df == s1) | (df.isna())).all(1)]
[out]
c1 c2 c3 c4 c5
1 H NaN g 5 NaN
Итак, в качестве функции вы можете сделать:
def df_match_string(frame, string):
s1 = pd.Series(list(string), index=[f'c{x+1}' for x in range(len(string))])
return ((frame == s1) | (frame.isna())).all(1)
df_match_string(df, s)
[out]
0 False
1 True
2 False
dtype: bool
Обновление
Я не могу воспроизвести вашу проблему с приведенным примером. Я предполагаю, что некоторые значения в вашем DataFrame могут иметь начальные / конечные пробелы?
Прежде чем пытаться использовать вышеуказанное решение, попробуйте выполнить этот шаг предварительной обработки:
for col in df:
df[col] = df[col].str.strip()