2017-11-08 3 views
0

データフレームをグループ化しました。いくつかの列の値をグループ単位で置き換えることができます。 したがって、0.95パーセンタイルより大きいグループ内のすべての値を0.95パーセンタイルに置き換え、0.05パーセンタイルより小さいすべての値を0.05パーセンタイルに置き換える必要があります。
データフレームは、この(another questionから取られた例)のようになります。 二つのグループ:「1」と「2つの」Pythonのパーセンタイルに基づいて列の値を置き換えます。

A   B   C 
0 0.719391 0.091693 one 
1 0.951499 0.83716  one 
2 0.975212 0.224855 one 
3 0.80762  0.031284 one 
4 0.63319  0.342889 one 
5 0.075102 0.899291 one 
6 0.502843 0.773424 one 
7 0.032285 0.242476 one 
8 0.794938 0.607745 one 
9 0.620387 0.574222 one 
10 0.446639 0.549749 two 
11 0.664324 0.134041 two 
12 0.622217 0.505057 two 
13 0.670338 0.99087  two 
14 0.281431 0.016245 two 
15 0.675756 0.185967 two 
16 0.145147 0.045686 two 
17 0.404413 0.191482 two 
18 0.94913  0.943509 two 
19 0.164642 0.157013 two 

このデータフレームのための結果は次のようになります。

A    B   C 
0 0.719391 0.091693 one 
1 0.951499 0.83716  one 
2 0.96454115 0.224855 one 
3 0.80762  0.05846805 one 
4 0.63319  0.342889 one 
5 0.075102 0.87133205 one 
6 0.502843 0.773424 one 
7 0.05155265 0.242476 one 
8 0.794938 0.607745 one 
9 0.620387 0.574222 one 
10 0.446639 0.549749 two 
11 0.664324 0.134041 two 
12 0.622217 0.505057 two 
13 0.670338 0.96955755 two 
14 0.281431 0.02949345 two 
15 0.675756 0.185967 two 
16 0.15391975 0.045686 two 
17 0.404413 0.191482 two 
18 0.8261117 0.943509 two 
19 0.164642 0.157013 two 

ていることに注意してください列Aの行2,7,16、および18が置換された。列Bの行3,5,13、および14が置換されている。

大規模なデータフレームで効率的にこれを行う方法を知っている人はいますか?

おかげ

答えて

2

あなたはgroupby + quantile + clipを使用することができます。

g = df.groupby('C').transform(lambda x: x.clip(*x.quantile([0.05, 0.95]))) 
g['C'] = df['C'] 

      A   B C 
0 0.719391 0.091693 one 
1 0.951499 0.837160 one 
2 0.964541 0.224855 one 
3 0.807620 0.058468 one 
4 0.633190 0.342889 one 
5 0.075102 0.871332 one 
6 0.502843 0.773424 one 
7 0.051553 0.242476 one 
8 0.794938 0.607745 one 
9 0.620387 0.574222 one 
10 0.446639 0.549749 two 
11 0.664324 0.134041 two 
12 0.622217 0.505057 two 
13 0.670338 0.969558 two 
14 0.281431 0.029493 two 
15 0.675756 0.185967 two 
16 0.153920 0.045686 two 
17 0.404413 0.191482 two 
18 0.826112 0.943509 two 
19 0.164642 0.157013 two 

正気ここ

np.allclose(e[['A', 'B']].values, g[['A', 'B']].values) 
True 

をチェックし、eは、あなたの質問で出力されます。

+0

。、.....私はあなたが答えを見なかったことを誓いました....投稿前に。 – Wen

+0

@Wel Relax、私は気にしません。私はupvoted :-) –

+0

LOL、まだパンダのクリップを使用してより良い〜;-) – Wen

2
df.groupby('C')['A','B'].transform(lambda x : np.clip(x,x.quantile(0.05),x.quantile(0.95))) 
Out[1599]: 
      A   B 
0 0.719391 0.091693 
1 0.951499 0.837160 
2 0.964541 0.224855 
3 0.807620 0.058468 
4 0.633190 0.342889 
5 0.075102 0.871332 
6 0.502843 0.773424 
7 0.051553 0.242476 
8 0.794938 0.607745 
9 0.620387 0.574222 
10 0.446639 0.549749 
11 0.664324 0.134041 
12 0.622217 0.505057 
13 0.670338 0.969558 
14 0.281431 0.029493 
15 0.675756 0.185967 
16 0.153920 0.045686 
17 0.404413 0.191482 
18 0.826112 0.943509 
19 0.164642 0.157013 
関連する問題