Pandas系列和dataframe替换和str.replace函数之间的区别

时间:2017-08-07 08:07:25

标签: python regex pandas replace

我有以下pandas数据帧(pandas 0.20.2,python 3.6.2):

#    df=pd.DataFrame([['abc00010                    Pathway'],['abc00020                    Pathway']], columns=["ENTRY"])
df3=pd.DataFrame(columns=["ENTRY"])
df3.loc[:,"ENTRY"]=[list(['abc00010                    Pathway']),list(['abc00020                    Pathway'])]


df["ENTRY2"]=df.loc[:,"ENTRY"]  
df["ENTRY3"]=df.loc[:,"ENTRY"]  
df["ENTRY4"]=df.loc[:,"ENTRY"]  
df["ENTRY5"]=df.loc[:,"ENTRY"]  
df["ENTRY6"]=df.loc[:,"ENTRY"]  


dfcleaner=re.compile(r"\W+?Pathway")  
df.loc[:,"ENTRY"]=df.loc[:,"ENTRY"].apply(str)
df.loc[:,"ENTRY"].replace(dfcleaner,"", inplace=True, regex=True)  

df.loc[:,"ENTRY2"]=df.loc[:,"ENTRY2"].apply(str)
df.loc[:,"ENTRY2"].replace(dfcleaner,"")

df.loc[:,"ENTRY3"].replace(dfcleaner,"", inplace=True, regex=True)
df["ENTRY4"]=df.loc[:,"ENTRY4"].str.replace(dfcleaner,"")#>NANA

df.loc[:,"ENTRY5"]=df.loc[:,"ENTRY5"].replace(dfcleaner,"", inplace=True, regex=True)
df.loc[:,"ENTRY6"]=df.loc[:,"ENTRY6"].replace(dfcleaner,"", regex=True)

    ENTRY   ENTRY2  ENTRY3  ENTRY4  ENTRY5  ENTRY6  
0   ['abc00010']    ['abc00010                    Pathway'] ['abc00010                    Pathway'] nan None    ['abc00010                    Pathway']
1   ['abc00020']    ['abc00020                    Pathway'] ['abc00020                    Pathway'] nan None    ['abc00020                    Pathway']

我预计ENTRY2不会被改变,ENTRY3和ENTRY6也不会被改变,因为它们不是字符串也不是转换成它,或者ENTRY5作为替换就不会返回。

我没想到的是字符串访问器的ENTRY4行为。你能解释一下吗?无法判断它是否是一个错误,如果它是一个错误还没有被报告......

编辑上面的代码,因为第一个代码没有给出与我想要的df完全相似/什么与我的代码中的结果相匹配

1 个答案:

答案 0 :(得分:1)

  

我预计不会改变ENTRY2,以及ENTRY3和ENTRY6   因为它们不是字符串也不是转换成它

您的所有列都是object(字符串)dtype:

In [11]: df.dtypes
Out[11]:
ENTRY     object
ENTRY2    object
ENTRY3    object
ENTRY4    object
ENTRY5    object
ENTRY6    object
dtype: object
  

替换为ENTRY5将不返回

这就是inplace=True的工作原理。您可以在使用inplace=False(默认值)时分配返回的DF:

df.loc[:,"ENTRY5"]=df.loc[:,"ENTRY5"].replace(dfcleaner,"", regex=True)

或就地更新 - 在这种情况下会返回None,因此我们应该将其分配回来:

df.loc[:,"ENTRY5"].replace(dfcleaner,"", inplace=True, regex=True)
  

我没想到的是字符串的ENTRY4行为   存取器。

我无法使用您的代码重现ENTRY4“问题”(Pandas 0.20.1):

In [16]: df
Out[16]:
      ENTRY                               ENTRY2    ENTRY3    ENTRY4 ENTRY5    ENTRY6
0  abc00010  abc00010                    Pathway  abc00010  abc00010   None  abc00010
1  abc00020  abc00020                    Pathway  abc00020  abc00020   None  abc00020