🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Q&A

解決済

2回答

307閲覧

【Python】DataFrameの行分割についてのご質問

iios

総合スコア4

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

0グッド

1クリップ

投稿2020/11/25 11:28

「名称」「カテゴリ1」「カテゴリ2」の3カラムを持ったデータフレームがあります。
「カテゴリ2」のカラムには「002、003、004」の値を「002~004」と、まとめて表記されてしまったデータとなっています。

名称 カテゴリ1 カテゴリ2
A A-1 001
A A-1 002
B B-1 001
B B-1 002~004

質問になります。
上記、カテゴリ2の「002~004」を「名称」「カテゴリ1」の値を持ったまま、
以下のように別の行に分割する方法をご教示いただけませんでしょうか。

名称 カテゴリ1 カテゴリ2
A A-1 001
A A-1 002
B B-1 001
B B-1 002 ★
B B-1 003 ★
B B-1 004 ★

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

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

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

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

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

guest

回答2

0

Python

1import pandas as pd 2import io 3import re 4 5txt = """ 6名称,カテゴリ1,カテゴリ2 7A,A-1,001 8A,A-1,002 9B,B-1,001 10B,B-1,002~004 11""" 12 13 14def make_list(s): 15 if re.fullmatch(r'\d{3}', s): 16 return [s] 17 if re.fullmatch(r'\d{3}~\d{3}', s): 18 return [f"{i:03}" for i in range(int(s[0:3]), int(s[4:7]) + 1)] 19 return None 20 21 22df = pd.read_csv(io.StringIO(txt)) 23df['カテゴリ2'] = df['カテゴリ2'].apply(make_list) 24# print(df) 25 26df = df.set_index(['名称', 'カテゴリ1'])['カテゴリ2'].apply(pd.Series).stack().reset_index() 27df.drop(columns=df.columns[2], inplace=True) 28df.columns = ['名称', 'カテゴリ1', 'カテゴリ2'] 29print(df)

result

1 名称 カテゴリ1 カテゴリ2 20 A A-1 001 31 A A-1 002 42 B B-1 001 53 B B-1 002 64 B B-1 003 75 B B-1 004

投稿2020/11/25 13:50

Daregada

総合スコア11990

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

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

iios

2020/11/26 00:51

ありがとうございます。 とても助かりました。
guest

0

ベストアンサー

Python

1print(df) 2# 名称 カテゴリ1 カテゴリ2 3#0 A A-1 001 4#1 A A-1 002 5#2 B B-1 001 6#3 B B-1 002~004 7 8def f(x): 9 l = x.split('~') 10 temp = [] 11 for i in range(int(l[0]), int(l[-1]) + 1): 12 temp.append(f'{i}'.zfill(3)) 13 return temp 14 15df['カテゴリ2'] = df['カテゴリ2'].apply(f) 16df = df.explode('カテゴリ2') 17print(df) 18# 名称 カテゴリ1 カテゴリ2 19#0 A A-1 001 20#1 A A-1 002 21#2 B B-1 001 22#3 B B-1 002 23#3 B B-1 003 24#3 B B-1 004

投稿2020/11/25 13:41

meg_

総合スコア10736

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

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

iios

2020/11/26 00:43

ありがとうございます。 実データの方でもうまく分割されました。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問