2014-04-14 128 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