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)
您可以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)
正如@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)
您将结果广播到整个列,而不仅仅是您正在处理的行。