请帮助我理解我的错误。
我正在尝试更改.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
答案 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
您正在将结果广播到整个列,而不仅仅是正在处理的行。