2016-11-22 10 views
0

パンダのデータフレーム:パンダのデータフレームの値を各グループの最初の行でどのように割りますか?

>>> df 
        sales net_pft 
STK_ID RPT_Date     
002138 20140930 3.325 0.607 
     20150930 3.619 0.738 
     20160930 4.779 0.948 
600004 20140930 13.986 2.205 
     20150930 14.226 3.080 
     20160930 15.499 3.619 
600660 20140930 31.773 5.286 
     20150930 31.040 6.333 
     20160930 40.062 7.186 

ちょうど各行の値は、このように、各グループの最初の行で分割されて出力を取得する方法を知りたい:

    sales net_pft 
STK_ID RPT_Date     
002138 20140930 1.000 1.000 
     20150930 1.088 1.216 
     20160930 1.437 1.562 
600004 20140930 1.000 1.000 
     20150930 1.017 1.397 
     20160930 1.108 1.641 
600660 20140930 1.000 1.000 
     20150930 0.977 1.198 
     20160930 1.261 1.359 

おかげで、

答えて

1
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) 
+0

私はパンダ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

+0

'df'の列のdtypeは何ですか? 'df.info()'を投稿してください。 – unutbu

+0

>>> df.info() <クラスのpandas.core.frame.DataFrame '> マルチインデックス: 販売:9つのエントリ、(002138、20140930)(600660、20160930) データ列(合計2列)に9 null以外のfloat64 net_pft 9 null以外のfloat64 dtypes:のfloat64(2)>>> – bigbug

関連する問題