import pandas as pd
df = pd.DataFrame({'RPT_Date': ['20140930', '20150930', '20160930', '20140930', '20150930', '20160930', '20140930', '20150930', '20160930'], 'STK_ID': ['002138', '002138', '002138', '600004', '600004', '600004', '600660', '600660', '600660'], 'net_pft': [0.607, 0.738, 0.948, 2.205, 3.080, 3.619, 5.286, 6.333, 7.186], 'sales': [3.325, 3.619, 4.779, 13.986, 14.226, 15.499, 31.773, 31.040, 40.062]})
df = df.set_index(['STK_ID','RPT_Date'])
firsts = (df.groupby(level=['STK_ID']).transform('first'))
result = df/firsts
利回り
net_pft sales
STK_ID RPT_Date
002138 20140930 1.000000 1.000000
20150930 1.215815 1.088421
20160930 1.561779 1.437293
600004 20140930 1.000000 1.000000
20150930 1.396825 1.017160
20160930 1.641270 1.108180
600660 20140930 1.000000 1.000000
20150930 1.198070 0.976930
20160930 1.359440 1.260882
上記メイントリックdf
と同じ形状であるが、その値は、各グループの最初の列から来るデータフレーム を作成するgroupby/transform('first')
を使用することである。
firsts = df.groupby(level=['STK_ID']).transform('first')
# net_pft sales
# STK_ID RPT_Date
# 002138 20140930 0.607 3.325
# 20150930 0.607 3.325
# 20160930 0.607 3.325
# 600004 20140930 2.205 13.986
# 20150930 2.205 13.986
# 20160930 2.205 13.986
# 600660 20140930 5.286 31.773
# 20150930 5.286 31.773
# 20160930 5.286 31.773
これは浪費であるがこれは、Pythonのグループをループすることを避けるため、望ましい結果を得るための最も速い方法です。上記のコードは、パンダバージョン0.13でTypeError: Transform function invalid for data types
を発生させた場合は、この回避策を使用して試みることができる
:
result = list()
for key, grp in df.groupby(level=['STK_ID']):
result.append(grp/grp.iloc[0])
result = pd.concat(result)
print(result)
私はパンダ13.0を使用して、などの問題満たし:>>>最初= df.groupbyを( トレースバック(最新のコール最後): ファイル ""、行1、 ファイル "C:\ Anaconda \ lib \ site-packages \ pandas \ core \ groupby.py "、行2319、変換中 return self._transform_item_by_item(obj、fast_path) ファイル "C:\ Anaconda \ lib \ site-packages \ pandas \ core \ groupby.py"(2386行目、_transform_item_by_item) raise TypeError( 'データ型に対して変換機能が無効') TypeError:データ型に変換機能が無効です –
bigbug
'df'の列のdtypeは何ですか? 'df.info()'を投稿してください。 – unutbu
>>> df.info() <クラスのpandas.core.frame.DataFrame '> マルチインデックス: 販売:9つのエントリ、(002138、20140930)(600660、20160930) データ列(合計2列)に9 null以外のfloat64 net_pft 9 null以外のfloat64 dtypes:のfloat64(2)>>> – bigbug