Как упоминал @Jan, сделать это с помощью df['sku'] = df['sku'].str.replace('k', '_')
- лучший / самый быстрый способ сделать это.
Однако, чтобы понять, почему вы получаете результаты, вы ичтобы представить способ, максимально приближенный к тому, как вы это делали, вы должны сделать:
import pandas as pd
df = pd.DataFrame(
{
'sku':["k1", "k2", "k3", "k4", "k5"],
'name': ["aaa", "bbb", "ccc", "ddd", "eee"],
'code':[886, 898,342,503,401]
}, columns =["sku", "name", "code"]
)
for i, r in enumerate(df['sku']):
r1 = r.replace('k', '_')
df.at[i, 'sku'] = r1
, что дает:
sku name code
0 _1 aaa 886
1 _2 bbb 898
2 _3 ccc 342
3 _4 ddd 503
4 _5 eee 401
В вашем коде ...
for r in df['sku']:
r1 = r.replace('k', '_')
... проблема здесь:
df['sku'] = r1
Вы транслируете свои результаты на весь столбеца не просто строка, над которой вы работаете.