Замена значений датафрейма в соответствии с заданным значением

Хочу заменить значения во всех столбцах датафрейма таким образом, что если они совпадают со значением в нулевой строке, то ставь 1, если не совпадают- ставь 0. Короче, обработчик правильности ответа. Но сталкиваюсь с тем, что replace учитывает регистр букв, а если я пытаюсь весь df привести к нижнему регистру, он не перезаписывается.

Тексты_1 Тексты_2 Тексты_3
БАВГ БГВДА ВБДГА
ДАВГБ NA ВБДГА
NA бвгад вбдга
дбгав бгвда NA
NA бвгда NA
NA БВГДА NA
дбавг NA NA
ДБАВГ БГВДА ВБДАГ
NA БАВГД NA
NA Бвгда Вбдга
df.columns = [x.lower() for x in df.columns]
for col in df.columns:
    df[col][1:].replace(df[col][0], 1)

Можно ли это как-нибудь обойти? Исходные данные на Листе 1, Желаемый результат на Листе 2

Ссылка


Ответы (2 шт):

Автор решения: strawdog

Можно как-нибудь так:

res = df.applymap(lambda x:x.lower() if type(x) == str else x)
res[res==res.iloc[0]]=1
res[res.notna()&res.ne(1)]=0
res.loc[0] = df.loc[0]

Тогда res будет:

  Тексты_1 Тексты_2 Тексты_3
0    ДБАВГ    БГВДА    ВБДГА
1        0      NaN        1
2      NaN        0        1
3        0        1      NaN
4      NaN        0      NaN
5      NaN        0      NaN
6        1      NaN      NaN
7        1        1        0
8      NaN        0      NaN
9      NaN        0        1

Для красоты можно еще сделать:

res=res.fillna("")

тогда res будет:

  Тексты_1 Тексты_2 Тексты_3
0    ДБАВГ    БГВДА    ВБДГА
1        0                 1
2                 0        1
3        0        1         
4                 0         
5                 0         
6        1                  
7        1        1        0
8                 0         
9                 0        1

→ Ссылка
Автор решения: Glebium
df = pd.DataFrame({
    1:["ds", "sdads", "DS", "sdasd,"],
    2: ["a", "dsad", "saa", "a"]
})

    1   2
0   ds  a
1   sdads   dsad
2   DS  saa
3   sdasd,  a

df = df.astype(str).apply(lambda x: x.str.lower())
df[1] = (df[1] == "ds").astype(int)
df[2] = (df[2] == "a").astype(int)
df

    1   2
0   1   1
1   0   0
2   1   0
3   0   1
→ Ссылка