我有一個來自數據庫的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,如果這有所作爲。謝謝。
非常好,負向預覽完美地工作。看起來你可能忘記將它添加到你在回覆中描述的代碼中,但是從使用前瞻的建議中,我使用了'split_data = df.str.split(',(?!)')。申請(pd.Series)' 如果您添加代碼,我會將答案標記爲已接受。謝謝。不幸的是,這些是第三方數據,我無法控制如何獲得它。任何想法爲什麼[,] \ b不工作? –
謝謝。我......搞砸了標記,實際上,這是在我的回答中,但不正確地呈現。 – Vynce
單詞邊界標記 - 「\ b」 - 是半神奇的;個人而言,我避免使用它,因爲我不確定從一種語言到另一種語言是否相同。但我不會指望一個逗號後跟一個空格必然是一個字的邊界,或者如果是這樣的話,我肯定會期待一個逗號後跟一個數字可能。不幸的是,我不容易找到python工作原理的定義。 – Vynce