2015-08-25 65 views
1

我有一個表,看起來像這樣:大熊貓:Dataframe.replace()的正則表達式

df_raw = pd.DataFrame(dict(A = pd.Series(['1.00','-1']), B = pd.Series(['1.0','-45.00','-']))) 

    A  B 
0 1.00 1.0 
1 -1  -45.00 
2 NaN  - 

我想換成「 - 」到「0.00」使用dataframe.replace(),但它的鬥爭,因爲的負值,'-1','-45.00'。

如何忽略負值並僅將' - '替換爲'0.00'?

我的代碼:

df_raw = df_raw.replace(['-','\*'], ['0.00','0.00'], regex=True).astype(np.float64) 

錯誤代碼:

ValueError: invalid literal for float(): 0.0045.00 
+1

對不起的將不僅僅是'df_raw.replace( ' - ',0.00)'在這種情況下工作? – EdChum

+0

令人驚訝的是,它確實如此,但爲什麼它不能像我那樣做呢? –

+0

,因爲你的正則表達式爲所有'-'找到一個匹配項,如果你這樣做了,那麼它只會匹配負項:'df_raw.replace(['^ - $'],['0.00'],regex = True) ' – EdChum

回答

4

你的正則表達式是所有-字符匹配上:

In [48]: 
df_raw.replace(['-','\*'], ['0.00','0.00'], regex=True) 

Out[48]: 
     A   B 
0 1.00  1.0 
1 0.001 0.0045.00 
2 NaN  0.00 

如果你把額外的邊界上,所以它僅匹配該單個字符與終止,然後按預期工作:

In [47]: 
df_raw.replace(['^-$'], ['0.00'], regex=True) 

Out[47]: 
     A  B 
0 1.00  1.0 
1 -1 -45.00 
2 NaN 0.00 

這裏^指字符串的開始和$意味着字符串的結尾,因此將只匹配對單個字符。

或者你也可以只使用replace這隻會匹配準確匹配:

In [29]: 

df_raw.replace('-',0) 
Out[29]: 
     A  B 
0 1.00  1.0 
1 -1 -45.00 
2 NaN  0 
+0

['^ - $']正是我所期待的,但我現在對正則表達式的理解很弱。非常感謝! –

+1

有一個方便[作弊工作表] fyi – EdChum

+0

我正在瀏覽類似的東西 - https://www.debuggex.com/的cheatsheet /正則表達式/蟒蛇。再次感謝! –