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
をデバッグするのに役立ちます何
おかげ
あなたのアドバイスを取って、なぜ 'グラム= 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が操作を簡単に適用できるようにする必要があると感じています。 –
@JeffTilton 2番目の変種は作業に非常に近いですが、問題は 'sort_values'が新しいデータフレームを返すことです。 apply(lambda df:df.sort_values( 'rank')) 'def func(x):x.sort_values( 'rank')'または一行の 'df.groupby( 'Alternatives' –