Замените значения ячеек в каждой строке столбца панд, используя цикл for - PullRequest
0 голосов
/ 23 июня 2018

Пожалуйста, помогите мне понять мою ошибку.Я пытаюсь изменить один столбец в моем файле .csv.У меня .csv файл выглядит следующим образом:

sku,name,code  
k1,aaa,886  
k2,bbb,898  
k3,ccc,342  
k4,ddd,503  
k5,eee,401  

Я хочу заменить символ "k" на символ "_" в столбце "sku".
Я написал код:

import sys  
import pandas as pd  
import numpy as np  
import datetime  

df = pd.read_csv('cat0.csv')  

for r in df['sku']:  
    r1 = r.replace('k', '_')  
    df['sku'] = r1  

print (df) 

Но код вставляет последнее значение в каждую строку столбца "sku".Итак, я получаю:

  sku name  code
0  _5  aaa   886
1  _5  bbb   898
2  _5  ccc   342
3  _5  ddd   503
4  _5  eee   401

Я хочу получить следующее:

  sku name  code
0  _1  aaa   886
1  _2  bbb   898
2  _3  ccc   342
3  _4  ddd   503
4  _5  eee   401

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Как упоминал @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  

Вы транслируете свои результаты на весь столбеца не просто строка, над которой вы работаете.

0 голосов
/ 23 июня 2018

Вы можете использовать str.replace на весь столбец:

from io import StringIO
import pandas as pd

data = """sku,name,code  
k1,aaa,886  
k2,bbb,898  
k3,ccc,342  
k4,ddd,503  
k5,eee,401"""

file = StringIO(data)

df = pd.read_csv(file)
df['sku'] = df['sku'].str.replace('k', '_')

print(df)

Это дает

  sku name  code  
0  _1  aaa     886
1  _2  bbb     898
2  _3  ccc     342
3  _4  ddd     503
4  _5  eee     401
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...