2016-09-09 23 views
0

データベースからのcsvファイルを持っています。私がクリーンアップしようとしているPandas DataFrameに変換しました。問題の1つは、分割する必要がある単一のセルに複数の値が入力されていることです。複雑な要因は、文字列のコメント(コンマでも可)がそのまま残す必要があることです。この問題は、下の例ではシリーズ形式で示されています。正規表現を使用して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) 

\ bの[、]すべきである私は、正規表現に新たなんだけど、私がとPythonに固有のカップル正規表現のサンドボックスを使用してから見てきたガイドから、それは正規表現のように思えます値は分割しますが、コメントは分割しません。しかし、この正規表現では何も分割しません。ここで

が、これは動作するはずと言うデバッガ、結果です: Debuggex Demo

は、私がここで簡単に何かが足りないのですか?この仕事をする上でより良いアイデアはありますか?私はPython 3.5を使っています。ありがとう。

答えて

1

私は先読みを使う傾向があります。どのように行うかは、期待されるデータに依存します。

これは否定的な先読みです。それはコンマの後ろに空白がついていないと言います。の場合、コンマのコメントに空白があり、分割するものとして「赤、緑」を扱いたいと考えています。

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

もう1つの選択肢は、有効な値のように見えるものについて肯定的な先読みです。これが唯一の番号が続いているカンマで分割うインスタンスのように、あなたの例では、数字だった:

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

正規表現は非常に強力ですが、正直なところ、私は、このソリューションは、あなたのために素晴らしいものだということを確認していませんこれが長期的な問題であれば。ワンタイム移行のようにほとんどのケースを正しく行うには問題ありませんが、長期的には問題が解決されるまでにここで解決することを検討します。とにかく、ここにあなたにとって便利な場合は、デバッグのPythonの正規表現のチートシートです:https://www.debuggex.com/cheatsheet/regex/python

+1

非常に良い、否定的な先読みは完全に動作します。レスポンスに記述したコードに追加するのを忘れてしまったようですが、先読みを使用するという提案から、私は 'split_data = df.str.split( '、(?!)')を使ってそこに行きました。 apply(pd.Series) ' コードを追加すると、回答を受け入れたものとしてマークします。ありがとう。残念ながら、これらは第三者のデータであり、私はそれをどのように取得するかについては何の支配もしていません。 [、] \ bがうまくいかなかった理由は何ですか?ありがとう。 –

+0

ありがとう。私は...実際にマークアップを台無しにしていたので、それは私の答えであったが、間違って描写された。 – Vynce

+0

単語境界マーカー - "\ b" - 半魔法です。個人的には、ある言語から別の言語への翻訳が同じであるかどうかわからないため、使用しないでください。しかし、スペースが続くカンマは必然的に単語の境界になるとは思っていませんでした。もしあれば、カンマの後ろに数字があると思います。残念ながら、私はPythonでどのように動作するのかの定義を簡単に見つけることはできません。 – Vynce

関連する問題