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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

Q&A

解決済

2回答

263閲覧

0でない数値が入っている列名を取得し、新しい列として定義する方法

MagMag

総合スコア80

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2022/06/23 02:52

編集2022/06/23 02:55

実現したいこと

  • 事例の表を元に、原料ごとのヒストグラムや箱ひげ図を作成したい。
  • この時、表の「根菜種」の列を左側の列の情報から、python(pandas/numpy想定)で自動で作りたい。
  • 事例の原料は3種類のみだが、実際のデータは20種類くらいある。
  • 今はif文で「根菜種」列を作っているが、利用原料数が多く、原料種も入れ替わるので、全原料をifやelifで列挙する方法は避けたい。

データ性質

  • 各使用量の列において、0より大きい数字が入る列1つのみ(例:大根と人参の同時使用はない)
  • ただし、全部使わないこともある(例:レシピ番号6)

事例(根菜種列を自動作成したい)

レシピ番号人参使用量大根使用量ごぼう使用量根菜種
11000人参
20200大根
30030ごぼう
40200大根
50010ごぼう
6000利用なし

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

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

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

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

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

can110

2022/06/23 02:59

現状のif文で事例の表、ヒストグラム、箱ひげ図が作成できていればそのコードを提示ください。 また、そのときの元となるデータ(表)も提示ください。
guest

回答2

0

既に解決していますが、ベストアンサーが.apply()を使った非効率な方法でしたので、改善案を提示します。

まず、下記の形のデータフレームを用意します。

python

1tmp_df = df.iloc[:, 1:] # 関係ない「レシピ番号」列を除外 2tmp_df.columns = tmp_df.columns.str.replace("使用量", "") # 列名が結果として入るワードになるように調整する 3tmp_df["利用なし"] = 1 # 利用なし列を追加、0より大きいかつ最小の値(=1)にする
人参大根ごぼう利用なし
010001
102001
200301
302001
400101
50001

これができたら.idxmax()メソッドで希望の列が得られます。

python

1df["根菜種"] = tmp_df.idxmax(1) 2print(df["根菜種"]) 3# 0 人参 4# 1 大根 5# 2 ごぼう 6# 3 大根 7# 4 ごぼう 8# 5 利用なし 9# dtype: object

投稿2022/06/29 07:30

kirara0048

総合スコア1399

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

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

melian

2022/06/29 07:41

idxmax を使う方法、見事です。
MagMag

2022/07/01 02:13

なるほど。ありがとうございます!
guest

0

ベストアンサー

python

1import pandas as pd 2import numpy as np 3import io 4 5pd.set_option('display.unicode.east_asian_width', True) 6 7csv_data = ''' 8レシピ番号,人参使用量,大根使用量,ごぼう使用量 91,10,0,0 102,0,20,0 113,0,0,30 124,0,20,0 135,0,0,10 146,0,0,0 15''' 16df = pd.read_csv(io.StringIO(csv_data)) 17 18# 19vegetables = [c.replace('使用量', '') for c in df.columns[1:]] + ['利用なし'] 20df['根菜種'] = df.iloc[:,1:].apply(lambda x: vegetables[np.where(x > 0)[0][0] if x.any() else -1], axis=1) 21 22print(df)

投稿2022/06/23 03:21

melian

総合スコア19796

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

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

MagMag

2022/06/23 04:13

できました!dfをdocstringで作る方法も感動しました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問