データのいくつかの変位値をマークしたいのですが、DataFrame の各行について、「xtile」などと呼ばれる新しい列のエントリにこの値を保持させたいと考えています。
たとえば、次のようなデータ フレームを作成するとします。
import pandas, numpy as np
dfrm = pandas.DataFrame({'A':np.random.rand(100),
'B':(50+np.random.randn(100)),
'C':np.random.randint(low=0, high=3, size=(100,))})
そして、配列内の各要素の五分位数を計算する独自の関数を作成するとします。これには独自の関数がありますが、たとえば、scipy.stats.mstats.mquantile を参照してください。
import scipy.stats as st
def mark_quintiles(x, breakpoints):
# Assume this is filled in, using st.mstats.mquantiles.
# This returns an array the same shape as x, with an integer for which
# breakpoint-bucket that entry of x falls into.
さて、本当の問題はtransform
、データに新しい列を追加するために使用する方法です。このようなもの:
def transformXtiles(dataFrame, inputColumnName, newColumnName, breaks):
dataFrame[newColumnName] = mark_quintiles(dataFrame[inputColumnName].values,
breaks)
return dataFrame
その後:
dfrm.groupby("C").transform(lambda x: transformXtiles(x, "A", "A_xtile", [0.2, 0.4, 0.6, 0.8, 1.0]))
問題は、上記のコードが新しい列「A_xtile」を追加しないことです。データフレームを変更せずに返すだけです。「A_xtile」と呼ばれる NaN などのダミー値でいっぱいの列を最初に追加すると、この列が正常に上書きされ、正しい五分位数が含まれるようになります。
しかし、私がその場で追加したいかもしれないこのようなものについて、最初にコラムに書かなければならないのは非常に不便です.
apply
各グループの異なるサイズの結果配列を理解する方法がわからないため、単純な方法はここでは機能しないことに注意してください。