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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Python

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

pandas

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

Q&A

解決済

2回答

1814閲覧

pandasで各行を指定回数複製する方法

beginner.py

総合スコア8

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Python

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

pandas

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

1グッド

0クリップ

投稿2020/06/10 02:38

編集2020/06/10 04:25

皆様、お世話になっております。
閲覧いただき、ありがとうございます。

pandasで下記コードを実施中に不明点が出ましたので質問させてください。

スプレッドシートの情報として以下をデータフレームとして読み込んでおりまして
サンプル1

大分類中分類小分類
Aa1
Bb2
Cc3
D

上記データフレームの各列を以下の内容に書き換えるようにしております

大分類中分類小分類
Aa1
Ab1
Ac1
Aa2
Ab2
Ac2
Aa3
Ab3
Ac3
Ba1
Bb1
Bc1
Ba2
Bb2
Bc2
Ba3
Bb3
Bc3
Bc3
Ca1
Cb1
Cc1
Ca2
Cb2
Cc2
Ca3
Cb3
Cc3
Cc3
Da1
Db1
Dc1
Da2
Db2
Dc2
Da3
Db3
Dc3

【条件】
・大分類は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様にご提供いただいた素敵なコードで対応できたのですが、
下記二点も追加で機能としてもたせたく今回ご相談させていただきます。

やりたいこと

  1. 大分類のリスト['A','B','C','D']が無限に増えていく場合、中分類と小分類のリストに大分類のリスト項目が増えた分「np.nan」を手動で足していく必要があるため上記を自動化したい。
  2. 大分類と中分類の間にα、β、γ列が増えた場合の対応を行いたい

2.スプレッドシートから読み込む情報変更した場合(α、β、γ列追加)
サンプル2

大分類α分類β分類γ分類中分類小分類
AIa1
Bb2
Cc3
D

2.最終的なアウトプットイメージ

大分類α分類β分類γ分類中分類小分類
AIa1
AIb1
AIc1
AIa2
AIb2
AIc2
AIa3
AIb3
AIc3
Ba1
Bb1
Bc1
Ba2
Bb2
Bc2
Ba3
Bb3
Bc3
Bc3
Ca1
Cb1
Cc1
Ca2
Cb2
Cc2
Ca3
Cb3
Cc3
Cc3
Da1
Db1
Dc1
Da2
Db2
Dc2
Da3
Db3
Dc3

【条件】
・大分類・α分類・β分類・γ分類は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ということで、どうすればできるのかご教授いただけると幸いです

大変お忙しいところ恐縮ですが、ご回答いただけると大変たすかります。
どうぞ、よろしくおねがいいたします。

kominato👍を押しています

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

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

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

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

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

guest

回答2

0

やりたいこと1
大分類のリスト['A','B','C','D']が無限に増えていく場合、中分類と小分類のリストに大分類のリスト項目が増えた分「np.nan」を手動で足していく必要があるため上記を自動化したい。

dictに格納された要素数が違うことで「arrays must all be the same length」というエラーが出るため上記解決策を記す

python

1import pandas as pd 2import numpy as np 3from itertools import product 4 5 6#今回読み込みたいデータをデータフレームに格納する サンプル1 7df1 = 読み込みたいデータフレーム 8 9 10data = {'大分類': df1['大分類'], 11 '小分類': df1['小分類'], 12 '中分類': df1['中分類'] 13 } 14 15#[ここの処理を追加] 要素数が足りないリストにnanを埋め込む 16data2 = pd.DataFrame({ key:pd.Series(value) for key, 17value in data.items() 18}) 19 20 21ret = pd.DataFrame(product(data2['大分類'].dropna(), 22 data2['小分類'].dropna(), 23 data2['中分類'].dropna()), 24 columns=["大分類",'中分類','小分類']).reindex(df.columns, axis=1) 25 26 27ret 28 29 30これでいくら大分類の要素数が増えようが、小分類と中分類のnanの数も自動で補えるので「arrays must all be the same length」にはなりません。 31以上 32

投稿2020/06/11 05:29

編集2020/06/11 05:49
beginner.py

総合スコア8

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

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

0

ベストアンサー

NaNの追加

それぞれの分類は配列にしているので、配列の要素数が最大のものと同じ要素数になるよう、他の配列にNaNを追加していくだけで済むと思います。

  • それぞれの配列の要素数をlen()で取得
  • そのうち最大の数値をmax_lenとし、
  • すべての配列の要素数がmax_lenになるまで末尾にNaNを追加する

分類列の追加

元の表にα~γ分類列を加えて、大分類に対応する文字列を加えるということですかね。
それなら元の表に以下のような処理を加えていけば良いかと思います。

  • 追加したい列の挿入

df.insert(位置,列名,初期値)で列を追加できます。

python

1ret.insert(1,'α分類',1)
  • データの準備

α分類には、大分類がAなら'一'、Bなら'二'...という対応と見受けられますので、辞書を使って変換表を作ります。これでdic_alpha['A'] → '一'とすれば変換できますね。

python

1dic_alpha = {'A':'一','B':'二','C':'三','D':'四'}
  • 追加列側に元データの準備

α列に大分類列の中身をコピーします。

python

1ret['α分類'] = ret['大分類']
  • map関数で各要素それぞれ置換をかける

α分類の各要素にmap関数で先ほど作った辞書を使った変換を書けます。ラムダ式でらくちん。

python

1ret['α分類'] = ret['α分類'].map(lambda x:dic_alpha[x])

これと同じ作業を残りの列にも行えば完了するでしょう。

投稿2020/06/10 04:32

hope_mucci

総合スコア4447

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

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

beginner.py

2020/06/10 05:27 編集

hope_mucci様 お忙しい中、ご回答いただきまして、ありがとうございます。 大変ありがたいです。 NaNの追加に関して、質問させていただきたいのですが、 >すべての配列の要素数がmax_lenになるまで末尾にNaNを追加する 例えばこれはどのようにすれば実現できるのでしょうか 例えば chu = [a,b,c] #中分類の要素数 maxlen = 30 len(chu) = 3 要素数を30-3=27個足りないため NaNで埋め合わせるのが必要かと存じます。 ですので、 for i in range(27): chu.append(np.nan) のような形をとればよいのかなとは思ったのですが、下記に入れ込むイメージがつかず df = pd.DataFrame({ '大分類': ['A','B','C','D'], '中分類': ['a','b','c',np.nan], '小分類': ['1','2','3',np.nan], }) 何かヒントをいただけると幸いでございます。 大変恐縮ですが、ご確認のほど、よろしくお願いいたします。 また、分類列の追加に関してはよくわかりました。ご丁寧に解説くださり大変たすかりました;;
hope_mucci

2020/06/10 06:43

chu = [a,b,c] #中分類の要素数 なら、 df = pd.DataFrame({ '大分類': ['A','B','C','D'], '中分類': chu, '小分類': ['1','2','3',np.nan], }) 他の分類も同様にできるでしょう。 # プログラミング、pythonの基礎をもっとしっかり勉強しましょう。基礎的なことがかなり理解できていないように見受けられます。
beginner.py

2020/06/10 07:06

hope_mucci様 ありがとうございます。ご丁寧にありがとうございます。 基礎をもっとしっかり勉強します。 どうぞ、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問