2017-10-15 21 views
0

スプレッドシートではかなり簡単に思えますが、私はパンダの構文を理解できません。グループ化できるデータセットがあります。各グループの集計統計を特定したいが、その集計を使用して元のデータフレームに新しい列を作成する。例えばパンダを使用して元のデータフレームにgroupby集約を適用する

、私のデータフレームは次のように見える場合:

d = pandas.dataframe({'class', : ['f1', 'f2', 'f3', 'f1'], 
'user': ['jack', 'jen', 'joe', 'jan'], 
'screen': [12, 23, 13, 15] }) 

はい、その私のデータが

は私が

d['gp'] = d['screen'].apply(d.groupby('class').stdev()) 

と保証するような何かをしたいと思います設定よりもはるかに小さいですd.groupby()。stdev()は実際にその行のそのクラスのstdevです。言い換えれば、f2クラスのgpを計算するときに、クラスf1のstdevを使用したくないのです。

私の脳は、スプレッドシートモードやPython for Loopで考えています。これを行うにはシンプルなパンダの構文が必要であることは知っていますが、これまでのところ私の検索には私のユースケースに合ったものは見つかりませんでした。

答えて

1

あなたが元Dataframeと同じ長さのリターンSeriesためtransformを必要とするようだ:

d['gp'] = d.groupby('class')['screen'].transform('std') 
print (d) 
    class screen user  gp 
0 f1  12 jack 2.12132 
1 f2  23 jen  NaN 
2 f3  13 joe  NaN 
3 f1  15 jan 2.12132 

あなたはNaN秒を取得し、いくつかのグループ(f2f3)は長さ1等しい

+1

正確に。私は同じ手紙を持っていた私の手紙 – Dark

+0

かなり。元のデータフレームに適用する集計操作が必要です。しかし、それぞれのグループは、グループごとにop(mean、std dev)を計算しなければなりません。つまりグループは –

+0

です。d ['screengrade'] = d.groupby( 'class')['screen']が必要です。ラムダx:x /(x.std()+ x.mean())* 200) '?私は電話しかないので、テストされていない。 – jezrael

0

を持っているので、私は」私はこのことをもう少し詳しくして、ここで私が望むものを定義する上でもう少し正確になりたいと思っています。私のデータセットには3つのクラスのグループがあります。私は各クラスの集計統計量を決定したい。平均、標準偏差。グループAの

groupamean =平均(グループAのリスト[「スクリーン」]) groupastddev = STDDEV(リスト[ '画面:私はdictのリスト上のpythonish擬似コードでこれをやっていたのであれば、それは次のようになります'])

pのグループAで: x.append =グループA [' スクリーン] * groupamean + groupastdev

これは、各グループのために繰り返されます。これは普通のpythonが私に考えさせる方法です。

データフレームオブジェクトを持つパンダは、新しい考え方を呼び起こします。一連の作業を行うためにループに使用する必要はありません。しかし、groupbyによって生成された集計関数を適用すると、正しいグループが得られることを保証する方法はわかりません。近づくように思わ

構文はこの

d['screengrade']= d['Screens Typed'].apply(lambda x: x/(classgroups.std + classgroups.mean) * 200) 

である。しかし、これは例外TypeError。

+0

がclassgroups.stdが関数なので、TypeErrorがスローされたように近づいています。 –

関連する問題