皆様、お世話になっております。
閲覧いただき、ありがとうございます。
pandasで下記コードを実施中に不明点が出ましたので質問させてください。
スプレッドシートの情報として以下をデータフレームとして読み込んでおりまして
サンプル1
大分類 | 中分類 | 小分類 |
---|---|---|
A | a | 1 |
B | b | 2 |
C | c | 3 |
D |
上記データフレームの各列を以下の内容に書き換えるようにしております
大分類 | 中分類 | 小分類 |
---|---|---|
A | a | 1 |
A | b | 1 |
A | c | 1 |
A | a | 2 |
A | b | 2 |
A | c | 2 |
A | a | 3 |
A | b | 3 |
A | c | 3 |
B | a | 1 |
B | b | 1 |
B | c | 1 |
B | a | 2 |
B | b | 2 |
B | c | 2 |
B | a | 3 |
B | b | 3 |
B | c | 3 |
B | c | 3 |
C | a | 1 |
C | b | 1 |
C | c | 1 |
C | a | 2 |
C | b | 2 |
C | c | 2 |
C | a | 3 |
C | b | 3 |
C | c | 3 |
C | c | 3 |
D | a | 1 |
D | b | 1 |
D | c | 1 |
D | a | 2 |
D | b | 2 |
D | c | 2 |
D | a | 3 |
D | b | 3 |
D | c | 3 |
【条件】
・大分類は1文字ごとに9回繰り返し+ABCD計4周させる
・中分類は大分類1文字にたいしてabcの順番で3回繰り返す
・小分類は大分類1文字にたいして111222333の順番で3回繰り返す
上記の実施コード(magichan様ご提供)
python
1import pandas as pd 2import numpy as np 3from itertools import product 4 5df = pd.DataFrame({ 6 '大分類': ['A','B','C','D'], 7 '中分類': ['a','b','c',np.nan], 8 '小分類': ['1','2','3',np.nan], 9}) 10ret = pd.DataFrame(product(df['大分類'].dropna(), 11 df['小分類'].dropna(), 12 df['中分類'].dropna()), 13 columns=['大分類','小分類','中分類']).reindex(df.columns, axis=1)
上記はmagichan様にご提供いただいた素敵なコードで対応できたのですが、
下記二点も追加で機能としてもたせたく今回ご相談させていただきます。
やりたいこと
- 大分類のリスト['A','B','C','D']が無限に増えていく場合、中分類と小分類のリストに大分類のリスト項目が増えた分「np.nan」を手動で足していく必要があるため上記を自動化したい。
- 大分類と中分類の間にα、β、γ列が増えた場合の対応を行いたい
2.スプレッドシートから読み込む情報変更した場合(α、β、γ列追加)
サンプル2
大分類 | α分類 | β分類 | γ分類 | 中分類 | 小分類 |
---|---|---|---|---|---|
A | 一 | ① | I | a | 1 |
B | 二 | ② | Ⅱ | b | 2 |
C | 三 | ② | Ⅲ | c | 3 |
D | 四 | ③ | Ⅳ |
2.最終的なアウトプットイメージ
大分類 | α分類 | β分類 | γ分類 | 中分類 | 小分類 |
---|---|---|---|---|---|
A | 一 | ① | I | a | 1 |
A | 一 | ① | I | b | 1 |
A | 一 | ① | I | c | 1 |
A | 一 | ① | I | a | 2 |
A | 一 | ① | I | b | 2 |
A | 一 | ① | I | c | 2 |
A | 一 | ① | I | a | 3 |
A | 一 | ① | I | b | 3 |
A | 一 | ① | I | c | 3 |
B | 二 | ② | Ⅱ | a | 1 |
B | 二 | ② | Ⅱ | b | 1 |
B | 二 | ② | Ⅱ | c | 1 |
B | 二 | ② | Ⅱ | a | 2 |
B | 二 | ② | Ⅱ | b | 2 |
B | 二 | ② | Ⅱ | c | 2 |
B | 二 | ② | Ⅱ | a | 3 |
B | 二 | ② | Ⅱ | b | 3 |
B | 二 | ② | Ⅱ | c | 3 |
B | 二 | ② | Ⅱ | c | 3 |
C | 三 | ③ | Ⅲ | a | 1 |
C | 三 | ③ | Ⅲ | b | 1 |
C | 三 | ③ | Ⅲ | c | 1 |
C | 三 | ③ | Ⅲ | a | 2 |
C | 三 | ③ | Ⅲ | b | 2 |
C | 三 | ③ | Ⅲ | c | 2 |
C | 三 | ③ | Ⅲ | a | 3 |
C | 三 | ③ | Ⅲ | b | 3 |
C | 三 | ③ | Ⅲ | c | 3 |
C | 三 | ③ | Ⅲ | c | 3 |
D | 四 | ④ | Ⅳ | a | 1 |
D | 四 | ④ | Ⅳ | b | 1 |
D | 四 | ④ | Ⅳ | c | 1 |
D | 四 | ④ | Ⅳ | a | 2 |
D | 四 | ④ | Ⅳ | b | 2 |
D | 四 | ④ | Ⅳ | c | 2 |
D | 四 | ④ | Ⅳ | a | 3 |
D | 四 | ④ | Ⅳ | b | 3 |
D | 四 | ④ | Ⅳ | c | 3 |
【条件】
・大分類・α分類・β分類・γ分類は1文字ごとに9回繰り返し(計4周させる)
・中分類は大分類1文字にたいしてabcの順番で3回繰り返す
・小分類は大分類1文字にたいして111222333の順番で3回繰り返す
試してみたこと
大分類に「"大分類","α分類","β分類","γ分類"」を格納してみました。
python
1import pandas as pd 2import numpy as np 3from itertools import product 4 5df1 = スプレッドシートから読み込んだサンプル2をデータフレームに格納したもの 6 7 8df = pd.DataFrame({ 9 '大分類': df1[["大分類","α分類","β分類","γ分類"]].values, 10 '中分類': ['a','b','c',np.nan], 11 '小分類': ['1','2','3',np.nan], 12}) 13ret = pd.DataFrame(product(df['大分類'].dropna(), 14 df['小分類'].dropna(), 15 df['中分類'].dropna()), 16 columns=['大分類','小分類','中分類']).reindex(df.columns, axis=1)
エラー分
Data must be 1-dimensional
一つ以上のディメンションがNGということで、どうすればできるのかご教授いただけると幸いです
大変お忙しいところ恐縮ですが、ご回答いただけると大変たすかります。
どうぞ、よろしくおねがいいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。