質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

3253閲覧

データフレームのある1列を条件により複数列に分割し、新たなデータフレームを作成する方法について

mi2

総合スコア63

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/03/03 07:41

編集2020/03/03 07:43

前提・実現したいこと

pandasのデータフレームにおいて、1列に以下の例のように数字と文字列が混じったものが存在しております。

これらから、数字で区切り複数列に分割し、数字と数字の間にはもし記号文字があればそのまま文字列の結合、もし記号文字がなければ半角スペースを挿入し分割したいと考えております。

インプットのデータフレームの例(1列)

column_name 1111 江戸川 コナン 1112 らき ☆ すた 1113 アルセーヌ ・ ルパン 1114 ポケットモンスター 1115 ジョジョ の 奇妙 な 冒険 :

アウトプットのデータフレームの例(2列)

id, name 1111, 江戸川 コナン(江戸川とコナンの間に半角空欄あり) 1112, らき☆すた(☆があるため半角空欄なし) 1113, アルセーヌ・ルパン(☆があるため半角空欄なし) 1114, ポケット モンスター(ポケットとモンスターの間に半角空欄あり) 1115, ジョジョ の 奇妙 な 冒険(ジョジョとのの間、のと奇妙の間、奇妙となの間、なと冒険の間にそれぞれ半角空欄あり)) :

考えたこと

pandasの1つのデータ(セル)の中の処理であればstr.split()で分割されたpandas.DataFrameが得られることは理解しました。これを行方向で複数分見る方法がいまいちわからず手をこまねいております。
恐縮ではございますが、お知恵を拝借できましたら幸いです。
何卒よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

もとのデータを

Python

1df['grp'] = df['column_name'].str.isdigit().cumsum() 2df.groupby('grp')['column_name'].apply(lambda d:d.reset_index(drop=True)).unstack().set_index(0, drop=True)

にてデータを列に展開できます。
さらに

Python

1df.apply(lambda d: d.dropna().values.tolist(), axis=1)

にてリストにまとめこともできますので、あとは文字列を結合すると良いかと。

Python

1import pandas as pd 2import io 3 4data = """ 5column_name 61111 7江戸川 8コナン 91112 10らき 1112すた 131113 14アルセーヌ 1516ルパン 171114 18ポケット 19モンスター 201115 21ジョジョ 2223奇妙 2425冒険 26""" 27 28df = pd.read_csv(io.StringIO(data)) 29 30df['grp'] = df['column_name'].str.isdigit().cumsum() 31df = df.groupby('grp')['column_name'].apply(lambda d:d.reset_index(drop=True)).unstack().set_index(0, drop=True) print(df) 32# 1 2 3 4 5 33#0 34#1111 江戸川 コナン NaN NaN NaN 35#1112 らき ☆ すた NaN NaN 36#1113 アルセーヌ ・ ルパン NaN NaN 37#1114 ポケット モンスター NaN NaN NaN 38#1115 ジョジョ の 奇妙 な 冒険 39 40df = df.apply(lambda d: d.dropna().values.tolist(), axis=1) 41print(df) 42#0 43#1111 [江戸川, コナン] 44#1112 [らき, ☆, すた] 45#1113 [アルセーヌ, ・, ルパン] 46#1114 [ポケット, モンスター] 47#1115 [ジョジョ, の, 奇妙, な, 冒険] 48#dtype: object

投稿2020/03/03 10:58

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mi2

2020/03/04 00:51

数字区切りでフラグを立て、集約するという発想を思い付きませんでした。大変勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問