2016-09-09 33 views
0

我有一個來自數據庫的csv文件,我已經轉換成了一個我正在嘗試清理的Pandas DataFrame。其中一個問題是多個值被輸入到需要分離的單個單元中。複雜的因素是有字符串註釋(也帶有逗號)需要保持不變。下面的例子以串聯形式說明了這個問題。使用正則表達式在Pandas系列的單個單元格中分隔逗號分隔的值

我有什麼:

Index | values  
0  | 2.54,3.563 
1  | bad design, right? 

我想要什麼:

Index | level_0 | values  
0  |  0  | 2.54 
1  |  0  | 3.563 
2  |  1  | bad design, right?  

正如你所看到的,有逗號分隔我想要的逗號後分裂,沒有下面的空間值,而字符串註釋中的逗號都有空格。似乎很容易使用正則表達式來分割。下面我使用從另一個StackOverflow解決方案中獲取的策略的解決方案是使用Series.str.split將值分隔爲單獨的列,然後堆疊列。該策略效果很好。但是,在這種情況下,正則表達式顯然不能識別分割。這裏是我的代碼:

Import pandas as pd 

# Example Series: 
data = pd.Series(("2.54,3.56", "3.24,5.864", "bad design, right?"), name = "values") 

# Split cells with multiple entries into separate rows 
split_data = data.str.split('[,]\b').apply(pd.Series) 

# Stack the results and pull out the index into a column (which is sample number in my case) 
split_data = split_data.stack().reset_index(0) 
split_data = split_data.reset_index(drop=True) 

我是新來的正則表達式,但是從導遊我已經看了,並使用一對夫婦針對Python正則表達式沙箱,好像正則表達式[,] \乙方應拆分值,但不是評論。但是,它不會用這個正則表達式分割任何東西。

這裏的調試器,它說這應該工作的結果: Debuggex Demo

我缺少的東西容易嗎?任何更好的想法,使這項工作?我使用Python 3.5,如果這有所作爲。謝謝。

回答

1

我會傾向於使用向前;你如何這樣做取決於你的預期數據。

這是一個負面的前瞻。它說「一個逗號沒有空格」,如果你是肯定所有的逗號都帶有空格,並且想將「紅色,綠色」作爲分割的對象,那麼將會是首選。

data.str.split('[,](?!\s)').apply(pd.Series) 

另一種選擇是看起來像一個有效值的東西的積極向前看;您的例子是數字,所以例如,這將在後跟數字後的逗號只拆分:

data.str.split('[,](?:\d)').apply(pd.Series) 

正則表達式是非常強大的,但說實話,我不知道,這個解決方案會爲你很大如果這是一個長期的問題。將大多數案例作爲一次性遷移應該沒問題,但是從長遠來看,我會考慮在問題到來之前解決問題。無論如何,這裏是Debuggex的python正則表達式備忘單,以防它對您有用:https://www.debuggex.com/cheatsheet/regex/python

+1

非常好,負向預覽完美地工作。看起來你可能忘記將它添加到你在回覆中描述的代碼中,但是從使用前瞻的建議中,我使用了'split_data = df.str.split(',(?!)')。申請(pd.Series)' 如果您添加代碼,我會將答案標記爲已接受。謝謝。不幸的是,這些是第三方數據,我無法控制如何獲得它。任何想法爲什麼[,] \ b不工作? –

+0

謝謝。我......搞砸了標記,實際上,這是在我的回答中,但不正確地呈現。 – Vynce

+0

單詞邊界標記 - 「\ b」 - 是半神奇的;個人而言,我避免使用它,因爲我不確定從一種語言到另一種語言是否相同。但我不會指望一個逗號後跟一個空格必然是一個字的邊界,或者如果是這樣的話,我肯定會期待一個逗號後跟一個數字可能。不幸的是,我不容易找到python工作原理的定義。 – Vynce

相關問題