使用for循环

时间:2018-06-23 12:30:22

标签: python python-3.x pandas csv replace

请帮助我理解我的错误。 我正在尝试更改.csv文件中的一列。 我有.csv文件,如下所示:

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

我想用“ sku”列中的“ _”符号替换“ k”符号。
我写了代码:

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 :(得分:3)

您可以在整列上使用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

答案 1 :(得分:2)

正如@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  

您正在将结果广播到整个列,而不仅仅是正在处理的行。