1. ホーム
  2. python

[解決済み] pandas: 列の中のテキストを複数の行に分割するには?

2022-04-27 03:51:50

質問

大きなcsvファイルを扱っていて、最後から2番目の列に特定のデリミターで分割したいテキストがあります。pandasまたはpythonを使用してこれを行う簡単な方法があるかどうか?

CustNum  CustomerName     ItemQty  Item   Seatblocks                 ItemExt
32363    McCartney, Paul      3     F04    2:218:10:4,6                   60
31316    Lennon, John        25     F01    1:13:36:1,12 1:13:37:1,13     300

スペースで分割したい (' ') の後にコロン (':') の中に Seatblocks の列ができますが、それぞれのセルで異なる列数になってしまいます。列を並べ替える関数があるので、その関数で Seatblocks 列はシートの最後にありますが、そこから先がよくわかりません。エクセルに内蔵されている text-to-columns しかし、私のデータセットはレコード数が多すぎて、エクセルでは処理しきれません。

最終的には、John Lennonのようなレコードを取り出して、複数の行を作成し、それぞれの座席の情報を別の行に表示したいのです。

どのように解決するのですか?

シートブロックをスペースごとに分割し、それぞれを独立した行にします。

In [43]: df
Out[43]: 
   CustNum     CustomerName  ItemQty Item                 Seatblocks  ItemExt
0    32363  McCartney, Paul        3  F04               2:218:10:4,6       60
1    31316     Lennon, John       25  F01  1:13:36:1,12 1:13:37:1,13      300

In [44]: s = df['Seatblocks'].str.split(' ').apply(Series, 1).stack()

In [45]: s.index = s.index.droplevel(-1) # to line up with df's index

In [46]: s.name = 'Seatblocks' # needs a name to join

In [47]: s
Out[47]: 
0    2:218:10:4,6
1    1:13:36:1,12
1    1:13:37:1,13
Name: Seatblocks, dtype: object

In [48]: del df['Seatblocks']

In [49]: df.join(s)
Out[49]: 
   CustNum     CustomerName  ItemQty Item  ItemExt    Seatblocks
0    32363  McCartney, Paul        3  F04       60  2:218:10:4,6
1    31316     Lennon, John       25  F01      300  1:13:36:1,12
1    31316     Lennon, John       25  F01      300  1:13:37:1,13

あるいは、コロンで区切られた文字列をそれぞれ独立したカラムで与える。

In [50]: df.join(s.apply(lambda x: Series(x.split(':'))))
Out[50]: 
   CustNum     CustomerName  ItemQty Item  ItemExt  0    1   2     3
0    32363  McCartney, Paul        3  F04       60  2  218  10   4,6
1    31316     Lennon, John       25  F01      300  1   13  36  1,12
1    31316     Lennon, John       25  F01      300  1   13  37  1,13

これは少し醜いですが、もしかしたら誰かがもっときれいな解決策を教えてくれるかもしれません。