2014-04-14 101 views
1

串清理我有一个熊猫列包含在引号,括号或没有包围的话行,像这样:问题与熊猫

"cxxx" 
[asdfasd] 
asdfasdf 
[asdf] 
"asdf" 

我的问题是,下面的代码被剥头以及没有引号或括号的元素中的最后一个字符,我不知道为什么。

def keyword_cleanup(x): 
    if "\"" or "[" in x: 
     return x[1:-1] 
    else: 
     return x 


csv["Keyword"] = csv["Keyword"].apply(keyword_cleanup) 

回答

3
if "\"" or "[" in x: 

应该

if "\"" in x or "[" in x: # x must contain a left bracket or double-quote. 

if x.startswith(('"', '[')): # x must start with a left-braket or double-quote 

因为Python解析前者为

if ("\"") or ("[" in x): 

由于in运营商绑定比or更紧密。 (见Python operator precedence

由于任何非空的字符串,如"\""已经布尔真值True,该if-statement的条件总是真,这就是为什么 keyword_cleanup总返回x[1:-1]


但是,还要注意熊猫有string operators builtin。使用它们将比使用apply为Series中的每个项目调用自定义Python函数要快得多。

In [136]: s = pd.Series(['"cxxx"', '[asdfasd]', 'asdfasdf', '[asdf]', '"asdf"']) 

In [137]: s.str.replace(r'^["[](.*)[]"]$', r'\1') 
Out[137]: 
0  cxxx 
1  asdfasd 
2 asdfasdf 
3  asdf 
4  asdf 
dtype: object 

如果你想要去除从每个串的两端都括号或双引号,你也可以使用

In [144]: s.str.strip('["]') 
Out[144]: 
0  cxxx 
1  asdfasd 
2 asdfasdf 
3  asdf 
4  asdf 
dtype: object 
+0

第一个选项为我的伟大工程。问题:为什么我的初始代码删除了不包含括号或引号的字符串中的第一个和最后一个字符,如python解析的那样:if(“\”“)或(”[“in x):' – metersk

+1

您可以也传递元组到'str.startswith()':'x.startswith((''','['))' – msvalkon

+1

@msvalkon:非常感谢你的改进。 – unutbu