Создайте фрейм данных, который отображает, содержат ли ваши индексы ваши столбцы или нет.
df = pd.DataFrame({}, columns=list('ABCD'), index=j)
Вы можете сделать это, используя str.contains
map_df = pd.DataFrame([df.index.str.contains(x) for x in df.columns],
columns=j,
index=list('ABCD')).T
Это создаст фрейм данных, где ячейки равны True
, если есть совпадение между столбцами и строками (например,, строка "AB"
и столбцы "A"
и "B"
) и False
в противном случае
A B C D
AB True True False False
AC True False True False
AD True False False True
BA True True False False
BC False True True False
BD False True False True
CA True False True False
CB False True True False
CD False False True True
DA True False False True
DB False True False True
DC False False True True
AA True False False False
BB False True False False
CC False False True False
DD False False False True
Теперь вы можете проверить, какие строки состоят из одинаковых дублированных символов (например, "AA"
или * 1017).*) используя regular expressions
>>> r = df.index.str.match(r"(\w)\1{1,}")
array([False, False, False, False, False, False, False, False, False,
False, False, False, True, True, True, True])
И используя операторы ~
и .iloc
, вы можете использовать applymap
для определения вашей логики для определенных наборов строк
map_df.iloc[~r, :] = map_df.iloc[~r,:].applymap(lambda k: 3 if k else 2)
map_df.iloc[r, :] = map_df.iloc[r,:].applymap(lambda k: 1 if k else 2)
A B C D
AB 3 3 2 2
AC 3 2 3 2
AD 3 2 2 3
BA 3 3 2 2
BC 2 3 3 2
BD 2 3 2 3
CA 3 2 3 2
CB 2 3 3 2
CD 2 2 3 3
DA 3 2 2 3
DB 2 3 2 3
DC 2 2 3 3
AA 1 2 2 2
BB 2 1 2 2
CC 2 2 1 2
DD 2 2 2 1