41680

[code]

    df1 = pd.DataFrame([[" A: a; aa; aaa; aaaa;aaaaa: Aa"],
       [" B: b;bb; bbb; bbbb;bbbbb:Bb"],
       ["C: c; cc; ccc;cccc; ccccc: Cc"],
       ["D: d; dd; ddd; dddd;ddddd:Dd"]])
    
[/code]

このデータフレームを出力してみると、

[code]

                                0
    0   A: a; aa; aaa; aaaa;aaaaa: Aa
    1   B: b;bb; bbb; bbbb;bbbbb:Bb
    2   C: c; cc; ccc;cccc; ccccc: Cc
    3   D: d; dd; ddd; dddd;ddddd:Dd
    
[/code]

となります。ご覧の通り:が最初と最後に2回、;がその間に4回入っており、その前後にところどころ空白があります。  
これを;と：で以下になるように7列に分割しようと思っています。

[code]

                    0   1   2    3   4     5     6
                0   A   a   aa  aaa aaaa aaaaa  Aa
                1   B   b   bb  bbb bbbb bbbbb  Bb
                2   C   c   cc  ccc cccc ccccc  Cc
                3   D   d   dd  ddd dddd ddddd  Dd
    
[/code]

まず;で分割しようと

[code]

    df2 = df1.iloc[:, [1]].str.split(';', expand=True)
    
[/code]

としてみたのですが

[code]

    IndexError: positional indexers are out-of-bounds
    
[/code]

とでてきました。  
以前、カラム名がもとからあってそこからカラム名を指定してstr.split(';', expand=
True)をおこなった場合は分割できたのですが…今回のようにカラム名を指定していないとできないのでしょうか？また、このように2つの文字(;、：)で分割したいとき、最初は;で、次に：で…というように分割できますでしょうか？最後に、理想の形は分割された文字列の先頭と末尾に空白が入らないようにしたいのですが何か方法があれば教えていただきたいです。よろしくお願い致します。


CC BY-SA 3.0
2018-02-13T01:27:52.757
41678
2018-02-13T04:23:56.550
27294
question
python pandas
データフレーム：特定の複数の文字で列を分割したい


(1) out-ob-bounds がでる  
単純に index値の間違いかと思います。(1ではなくて0)

[code]

    df2 = df1.iloc[:, 0].str.split(';|:', expand=True)
    
[/code]

としてみてください

(2) 最初は";"で、次に"：" で分割

[code]

    df2 = df1.iloc[:, 0].str.split(';', expand=True)
    df3 = pd.concat([df2.iloc[:, 0].str.split(':', expand=True), df2.iloc[:, 1:4],df2.iloc[:, 4].str.split(':', expand=True)], ignore_index=True, axis=1)
    
[/code]

のようにすると出来るかとは思いますが、面倒なわりに結果は(1)と同じです。  
split()する順番を変えた際に、結果にどのような違いがでることを期待されてますでしょうか？。

(3) 先頭と末尾の空白にする  
データ分割をしてDataFraemを構築した後、にDataFrame全体に対して str.strip() をするとよいのではないでしょうか。

[code]

    df2 = df1.iloc[:, 0].str.split(';|:', expand=True)
    df2 = df2.apply(lambda d: d.str.strip())
    
[/code]


CC BY-SA 3.0
2018-02-13T04:23:56.550
41680
2018-02-13T04:23:56.550
24801
41678
answer