pandas:为什么在这里df.replace()方法没作用?

新手上路,请多包涵

最近利用pandas来帮同事完成一些无聊的工作,
从某个后台导出销量数据csv格式,想在读入csv数据成数据框后,就把仓库名称替换成它的简称,方便查看。
查阅文档后,说可以用Series.replace(),或者dataframe.replace()方法,
于是写了df.replace('AAA','BBB'),但是不知为什么没有作用,把数据框切片后形成Series,然后用Series.replace()方法也不行,不知道为什么

import csv
import pandas as pd
import numpy as np 
from pandas import DataFrame,Series

csvfilename = 'suppReport.csv' 
df=pd.DataFrame(pd.read_csv(csvfilename,header = 0 ,encoding='gbk'))
ss = df[['仓库编码']]
ss.replace('北领成都商超仓','北领成都')
ss.replace('科捷合肥商超仓','科捷合肥')
df.replace('科捷合肥商超仓','科捷合肥') 

# view first 3 records
print(df[:3]) 
#看了打印结果,名称还是没替换成功= =b

#数据透视表
df_pivortable=pd.pivot_table(df,index=['商品id'],columns=['仓库编码'],
values=['销量'],aggfunc='sum',fill_value= 0,dropna=False)

#
dataframed_pivortable = pd.DataFrame(df_pivortable)
dataframed_pivortable.insert(0,'1',0)  #插入列能成功
print(dataframed_pivortable)


print('executing...')

str_day_filename = '每日销量'+'.xlsx'

dataframed_pivortable.to_excel(str_day_filename, sheet_name='Sheet1')

阅读 18.4k
5 个回答

需要inplace=1

ss.replace('北领成都商超仓','北领成都', inplace=1)
ss.replace('科捷合肥商超仓','科捷合肥', inplace=1)
df.replace('科捷合肥商超仓','科捷合肥', inplace=1) 
import pandas as pd

lst = [
    {"a":1,"b":1},
    {"a":2,"b":2}
]

df = pd.DataFrame(lst)
df['a'] = df['a'].replace(1, 11)
df['a'] = df['a'].replace(2, 22)
print df

panda大量操作数据的函数都是not inplace的,新的df作为函数的返回值返回,要直接改动原df的话需要传inplace参数为True

inplace : boolean, default False
If True, in place. Note: this will modify any other views on this object (e.g. a column form a DataFrame). Returns the caller if this is True.

批量替换大数据的时候inplace=True是不顶用的 a.f=a.f.replace(x,y) 这种形式好一些

有没有可能和这一列的数据类型有关系呢?

data['ss'].replace({-999:np.nan},inplace=True) #这样写也总是替换不成功

data['ss'].astype(float).replace({-999:np.nan},inplace=True) #这样写就成功了

发现data['ss']的数据类型是Object,而替换的-999是int,所以按照上面代码里第一行那样写就会失败,需要先转换一下数据类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题