2016-11-03 10 views
2

パンダのデータフレームでグループ化されたデータに対して機能を実行したい。 私は以下のdfを持っていて、繰り返し次のことをしますが、これはpandas groupbyによって行われるべきだと思います。パンダがグループ化されたデータに対して操作を実行する

import pandas as pd 
import scipy 
from scipy.stats import mstats 

df = pd.DataFrame({'cfs': [147248, 94894, 81792, 176011, 208514, 18111, 56742, 154900, 32778, 142333, 45267, 145211, 3429, 1258, 65439], 'Alternatives':['A','B','C']*5}) 

alternatives = list(set(df['Alternatives'])) 

df2 = pd.DataFrame() 

for alternative in alternatives: 
    alt = pd.DataFrame(df[(df.Alternatives == alternative)]) 
    alt = alt.sort_values(['cfs']) 
    alt['rank'] = alt['cfs'].rank() 
    alt['pp'] = 1 - scipy.stats.mstats.plotting_positions(alt['cfs'],0,0) 
    df2 = df2.append(alt) 

出力:

Alternatives  cfs rank  pp 
12   A 3429 1.0 0.833333 
6    A 56742 2.0 0.666667 
9    A 142333 3.0 0.500000 
0    A 147248 4.0 0.333333 
3    A 176011 5.0 0.166667 
5    C 18111 1.0 0.833333 
8    C 32778 2.0 0.666667 
14   C 65439 3.0 0.500000 
2    C 81792 4.0 0.333333 
11   C 145211 5.0 0.166667 
13   B 1258 1.0 0.833333 
10   B 45267 2.0 0.666667 
1    B 94894 3.0 0.500000 
7    B 154900 4.0 0.333333 
4    B 208514 5.0 0.166667 

私は

df['rank'] = df['cfs'].groupby(df['Alternatives']).rank() 

でランクを取得することができます。しかし、私はプロットの位置を取得することはできません。私が持っている最も近いです:

group = df['cfs'].groupby(df['Alternatives']).apply(scipy.stats.mstats.plotting_positions,0,0) 

これは私に正しいデータとパンダのシリーズを与えるが、私は何をしたいです:

df['pp'] = df['cfs'].groupby(df['Alternatives']).apply(scipy.stats.mstats.plotting_positions,0,0) 

しかし、これはただのNaN

の列を返します。 get_groupを使用している groupbyをデバッグするのに役立ちます何

おかげ

答えて

2
def func(x): 
    x['pp'] = 1 - scipy.stats.mstats.plotting_positions(x.cfs, 0, 0) 
    return x 

df.groupby('Alternatives').apply(func) 

    Alternatives  cfs  pp 
0    A 147248 0.333333 
1    B 94894 0.500000 
2    C 81792 0.333333 
3    A 176011 0.166667 
4    B 208514 0.166667 
5    C 18111 0.833333 
6    A 56742 0.666667 
7    B 154900 0.333333 
8    C 32778 0.666667 
9    A 142333 0.500000 
10   B 45267 0.666667 
11   C 145211 0.166667 
12   A 3429 0.833333 
13   B 1258 0.833333 
14   C 65439 0.500000 

:。

g = df.groupby('Alternatives').get_group('A') 
g.apply(whatever) # test on a single group and then apply to all at once 
+1

あなたのアドバイスを取って、なぜ 'グラム= df.groupby( '代替')しget_group( 'A')'、 'g.sort_values( 'ランク')'の作品が、 'df.groupby ( 'Alternatives')。sort_values( 'rank') 'はありませんか? 'def func(x):x.sort_values( 'rank')もx df.groupby( 'Alternatives')。apply(func)'を返しません。私は助けていただきありがとうございます.GBが操作を簡単に適用できるようにする必要があると感じています。 –

+0

@JeffTilton 2番目の変種は作業に非常に近いですが、問題は 'sort_values'が新しいデータフレームを返すことです。 apply(lambda df:df.sort_values( 'rank')) 'def func(x):x.sort_values( 'rank')'または一行の 'df.groupby( 'Alternatives' –

関連する問題