Замена значений датафрейма в соответствии с заданным значением
Хочу заменить значения во всех столбцах датафрейма таким образом, что если они совпадают со значением в нулевой строке, то ставь 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