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

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

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

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

pandas

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

Q&A

解決済

1回答

4229閲覧

DataFrameに値を代入するとNaNになってしまう。

MagMag

総合スコア80

Python

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

pandas

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

1グッド

0クリップ

投稿2020/04/13 02:12

PandasのMultiindexを使って、各上位index毎の列最大値に対する割合を出そうとしています。2つの方法を試していますが、それぞれで問題が発生しており、対応を教えてもえらえないでしょうか?

方法1として、for文を使って、上位index毎に割合を算出しています。
print文で出した計算は想定通り返されるのですが、これを元DdataFrameに代入しようとすると算出値の代わりにNaNが代入されてしまいます。

方法2はfor文を使わないでgroupbyで処理する方法を試したのですが、おそらく分母と分子でindexが異なるのでエラーが返ってきています。

Python3.6

1import pandas as pd 2import numpy as np 3 4# データフレームを作成 5df_A = pd.DataFrame(np.arange(30).reshape(5, 6)) 6df_B = pd.DataFrame(np.arange(24).reshape(4, 6)) 7 8# データフレームをつなげてMultiIndex化 9df = pd.concat([df_A, df_B], keys=['dfA', 'dfB']) 10 11# 方法1:forループで処理 12# 各index毎に列の最大値で割る操作を実施 13for index in ['dfA', 'dfB']: 14 print(df.loc[index] / df.loc[index].max()) # 期待通りの結果 15 df.loc[index] = df.loc[index] / df.loc[index].max() # NaNが代入される 16 17print(df) #すべてNaNの行列 18 19# 方法2:groupbyで処理 20df = df/df.groupby(level=0).max() 21#ValueError: cannot join with no overlapping index names
magichan👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

方法1の場合

MultiIndexのlevel毎にSliceにはpandas.IndexSliceをお使いください

https://pandas.pydata.org/pandas-docs/version/0.25.0/reference/api/pandas.IndexSlice.html#pandas.IndexSlice

こちらに解説があります。
https://pandas.pydata.org/pandas-docs/version/0.25.0/user_guide/advanced.html#using-slicers

方法2の場合

ジャストアイデアですが、GroupBy.transform()で同じ構成のデータフレームを作成して演算処理を行うと良いのではないでしょうか。

Pythn

1import pandas as pd 2import numpy as np 3 4# データフレームを作成 5df_A = pd.DataFrame(np.arange(30).reshape(5, 6)) 6df_B = pd.DataFrame(np.arange(24).reshape(4, 6)) 7 8# データフレームをつなげてMultiIndex化 9df = pd.concat([df_A, df_B], keys=['dfA', 'dfB']) 10 11# 方法1:forループで処理 12# 各index毎に列の最大値で割る操作を実施 13for index in ['dfA', 'dfB']: 14 df.loc[pd.IndexSlice[index,:], :] = df.loc[pd.IndexSlice[index,:], :] / df.loc[index].max() 15 # ↑は長いので↓で良いと思う 16 #df.loc[pd.IndexSlice[index,:], :] /= df.loc[index].max() 17# 0 1 2 3 4 5 18#dfA 0 0.000000 0.040000 0.076923 0.111111 0.142857 0.172414 19# 1 0.250000 0.280000 0.307692 0.333333 0.357143 0.379310 20# 2 0.500000 0.520000 0.538462 0.555556 0.571429 0.586207 21# 3 0.750000 0.760000 0.769231 0.777778 0.785714 0.793103 22# 4 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 23#dfB 0 0.000000 0.052632 0.100000 0.142857 0.181818 0.217391 24# 1 0.333333 0.368421 0.400000 0.428571 0.454545 0.478261 25# 2 0.666667 0.684211 0.700000 0.714286 0.727273 0.739130 26# 3 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 27 28# 方法2:groupbyで処理 29df = df/df.groupby(level=0).transform('max') 30# 0 1 2 3 4 5 31#dfA 0 0.000000 0.040000 0.076923 0.111111 0.142857 0.172414 32# 1 0.250000 0.280000 0.307692 0.333333 0.357143 0.379310 33# 2 0.500000 0.520000 0.538462 0.555556 0.571429 0.586207 34# 3 0.750000 0.760000 0.769231 0.777778 0.785714 0.793103 35# 4 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 36#dfB 0 0.000000 0.052632 0.100000 0.142857 0.181818 0.217391 37# 1 0.333333 0.368421 0.400000 0.428571 0.454545 0.478261 38# 2 0.666667 0.684211 0.700000 0.714286 0.727273 0.739130 39# 3 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000

投稿2020/04/13 03:21

magichan

総合スコア15898

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

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

MagMag

2020/04/13 05:36

ありがとうございました!両方の解決法共に大変役に立ちました! pandasって便利ですが、機能が多くてややこしいですね(^ ^;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問