2017-03-08 6 views
1

私は次の形式でパンダシリーズ(名前はDF)があります。パンダシリーズextractallエラー

     col1 
    a    GEOS 13100 
    b    MATH 13100-MATH 13200 
    c    MATH 19100-19200 
    d    SPAN 10300 or 20300 
    e    EGPT 10101-10102-10103 
    f    MOGK 10100/30100 
    g    PHSC 12600 must be taken before PHSC 12620 

を私はすべてのコース(「[AZ] {4} \ sのを抽出したい* \ dの{5} "または" \ d {5} ")をcol1から取得します。所望のデータセットは、次の形式になります。

  col1  col2   col3   col4  col5 
a  GEOS 13100 
b  MATH 13100  -   MATH 13200 
c  MATH 19100  -   19200 
d  SPAN 10300  or   20300 
e  EGPT 10101  -   10102   -   10103 
f  MOGK 10100 /  30100 
g  PHSC 12600     PHSC 12620 

Iは

df.col1.str.extract('(([A-Z]{4}\s*\d{5}?)|(\d{5}?)).*?(and|\-|or|\, or|\:|\/|\.|\;|\(|\s?)') 

を試み、最初に一致したパターンを得ました。

私は

df.col1.str.extractall('(([A-Z]{4}\s*\d{5}?)|(\d{5}?)).*?(and|\-|or|\, or|\:|\/|\.|\;|\(|\s?)') 

を試みたが、次のエラーを得た:

Length of names must match number of levels in MultiIndex. 

誰もが、私が何をすべきか任意のアイデアを持って?

+0

ご希望のデータセットを投稿することができますか? – MaxU

+0

私はそれを投稿しました。ありがとうございました! @マックス – Claudia

答えて

0

古いバージョンのpandasを使用している場合は、this issueのようなものになっている可能性があります(インデックスは問題のないフォームに見えるかもしれませんが)。バージョン0.19.0では、両方のケースがエラーなしで実行します。

In [25]: df = pd.DataFrame({'col1': ['SPAN 10300 or 20300', 'SPAN 10300 or 20301', 'MOGK 10100/30100', 'PHSC 12600 must be taken before PHSC 12620']}) 

In [26]: df.index = ['a', 'b', 'c', 'd'] 

In [27]: df 
Out[27]: 
            col1 
a       SPAN 10300 or 20300 
b       SPAN 10300 or 20301 
c       MOGK 10100/30100 
d PHSC 12600 must be taken before PHSC 12620 

In [28]: df.col1.str.extract('(([A-Z]{4}\s*\d{5}?)|(\d{5}?)).*?(and|\-|or|\, or|\:|\/|\.|\;|\(|\s?)') 
/usr/local/bin/ipython:1: FutureWarning: currently extract(expand=None) means expand=False (return Index/Series/DataFrame) but in a future version of pandas this will be changed to expand=True (return DataFrame) 
    #!/usr/local/bin/python3.5 
Out[28]: 
     0   1 2 3 
a SPAN 10300 SPAN 10300 NaN 
b SPAN 10300 SPAN 10300 NaN 
c MOGK 10100 MOGK 10100 NaN/
d PHSC 12600 PHSC 12600 NaN 

In [29]: df.col1.str.extractall('(([A-Z]{4}\s*\d{5}?)|(\d{5}?)).*?(and|\-|or|\, or|\:|\/|\.|\;|\(|\s?)') 
Out[29]: 
       0   1  2 3 
    match          
a 0  SPAN 10300 SPAN 10300 NaN  
    1   20300   NaN 20300 NaN 
b 0  SPAN 10300 SPAN 10300 NaN  
    1   20301   NaN 20301 NaN 
c 0  MOGK 10100 MOGK 10100 NaN /
    1   30100   NaN 30100 NaN 
d 0  PHSC 12600 PHSC 12600 NaN  
    1  PHSC 12620 PHSC 12620 NaN NaN 
0

これを試してみてください:

In [172]: df.col1.str.extractall(r'(\w{4}\s\d{4,}|\d{4,}|[\-/]|or)').unstack().fillna('') 
Out[172]: 
       0 
match   0 1   2 3  4 
a  GEOS 13100 
b  MATH 13100 - MATH 13200 
c  MATH 19100 -  19200 
d  SPAN 10300 or  20300 
e  EGPT 10101 -  10102 - 10103 
f  MOGK 10100 /  30100 
g  PHSC 12600 or PHSC 12620