使用 for 循环替换 pandas 列的每一行中的单元格值

j.s*_*lin 5 python csv replace python-3.x pandas

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

sku,name,code  
k1,aaa,886  
k2,bbb,898  
k3,ccc,342  
k4,ddd,503  
k5,eee,401  
Run Code Online (Sandbox Code Playgroud)

我想用“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) 
Run Code Online (Sandbox Code Playgroud)

但是代码在“sku”列的每一行中插入最后一个值。所以我得到:

  sku name  code
0  _5  aaa   886
1  _5  bbb   898
2  _5  ccc   342
3  _5  ddd   503
4  _5  eee   401
Run Code Online (Sandbox Code Playgroud)

我想得到如下:

  sku name  code
0  _1  aaa   886
1  _2  bbb   898
2  _3  ccc   342
3  _4  ddd   503
4  _5  eee   401
Run Code Online (Sandbox Code Playgroud)

Jan*_*Jan 5

您可以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)
Run Code Online (Sandbox Code Playgroud)

这产生

  sku name  code  
0  _1  aaa     886
1  _2  bbb     898
2  _3  ccc     342
3  _4  ddd     503
4  _5  eee     401
Run Code Online (Sandbox Code Playgroud)


Zev*_*Zev 5

正如@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  
Run Code Online (Sandbox Code Playgroud)

这使:

  sku name  code
0  _1  aaa   886
1  _2  bbb   898
2  _3  ccc   342
3  _4  ddd   503
4  _5  eee   401
Run Code Online (Sandbox Code Playgroud)

在你的代码中...

for r in df['sku']:  
    r1 = r.replace('k', '_')  
Run Code Online (Sandbox Code Playgroud)

...问题就在这里:

    df['sku'] = r1  
Run Code Online (Sandbox Code Playgroud)

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