方法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 05:36