我有以下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完全相似/什么与我的代码中的结果相匹配
答案 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