2017-02-23 10 views
3
例えば

に1つのパンダの列のテキストを分割が、私は1頭のパンダ列が含まれている必要があり、複数の列

text 
A1V2 
B2C7Z1 

アルファベットが値を続いて、私は26(AZ)の列に分割したい、それが欠落している場合は、-1 。

だから、それは

text A B C D ... Z 
A1V2 1 -1 -1 -1 ... -1 
B2C7Z1 -1 2 7 -1 ... 1 

むしろdf.apply(使用するよりも任意の高速な方法はあります)することができますか?

フォローアップ: 賢明な答えに感謝します。メソッドを使用して4百万行を実行すると、1時間かかりました。私はそれを速くする別の方法があることを願っています。 str.extractall()は最も時間がかかるものです。

答えて

4

は別々の列にキー([A-Z])値([0-9] +)と長いそこにあなたを取得する必要があります変換ワイドにを抽出し、正規表現(?P<key>[A-Z])(?P<value>[0-9]+)str.extractallを試してみてください。ここ

letterDigitsパターンと2つのキャプチャグループは、(?P<>構文を使用して)列キーとして結果に二つの別々の列に行く(?P<key>[A-Z])(?P<value>[0-9]+)マッチはRegex。

そしてextractallは別々の行に複数の一致を置くために、あなたはkey列にunstackで幅広いフォーマットに変換する必要があります。

(df.text.str.extractall("(?P<key>[A-Z])(?P<value>[0-9]+)") 
.reset_index('match', drop=True) 
.set_index('key', append=True) 
.value.unstack('key').fillna(-1)) 

#key A B C V Z 
# 0 1 -1 -1 2 -1 
# 1 -1 2 7 -1 1 
+0

スマートです! – MaxU

+0

これはいいです:) – Shijo

+0

@MaxUコメントを評価してください。 – Psidom

関連する問題