2017-03-31 4 views
2

データフレームの列のグループの中央値を計算したいと考えています。私は次の例のデータフレームを持っています。実際のデータフレームでは、列数、列名、グループ名はユーザーの入力に応じて動的です。パンダのデータフレーム群のメジアンを取得

raw_data= {'a':['g1','g2','g3','g4','g5'],'b':[10,11,12,13,14],'c':[5,6,7,8,9],'d':[112,1,0,9,8],'e':[6,7,8,0,9],'f':[0,1,6,7,8],'g':[9,8,6,5,4]} 
mydf= pd.DataFrame(raw_data) 
newdf= mydf.set_index('a') 

私は私の列のグループ情報を格納し、別の辞書を持って

gp_dict= {'gp1':['b','c','d'],'gp2':['e','f','g']} 

現在のデータフレーム:

 b c d e f g 
a      
g1 10 5 112 6 0 9 
g2 11 6 1 7 1 8 
g3 12 7 0 8 6 6 
g4 13 8 9 0 7 5 
g5 14 9 8 9 8 4 

グループごとに中央値を取得し、中央値より大きい場合行を維持する必要があります私のコードいずれのグループについても8より大きい。

所望の出力:

明らか
 b c d e f g 
g1 10 5 112 6 0 9 
g4 13 8 9 0 7 5 
g5 14 9 8 9 8 4 

、中間ステップは、両方のグループに中央値をcalcuateする必要があります:

 b c d e f g Median_gp1 Median_gp2 
g1 10 5 112 6 0 9 10   6 
g2 11 6 1 7 1 8 6   7 
g3 12 7 0 8 6 6 7   6 
g4 13 8 9 0 7 5 9   5 
g5 14 9 8 9 8 4 9   8 

答えて

8

あなたは、列がスワップの辞書でgroupbyを使用し、集約mediananyと比較することができます1行につき少なくとも1つはTrueです。 boolean indexingによって最終フィルタ:

#swap key values in dict 
#http://stackoverflow.com/a/31674731/2901002 
d = {k: oldk for oldk, oldv in gp_dict.items() for k in oldv} 
mask = newdf.groupby(d, axis=1).median().gt(8).any(1) 
#same as 
#mask = (newdf.groupby(d, axis=1).median() > 8).any(1) 
print (newdf[mask]) 
    b c d e f g 
a      
g1 10 5 112 6 0 9 
g4 13 8 9 0 7 5 
g5 14 9 8 9 8 4 
+0

非常に素晴らしい、解決策はほとんど自然言語のように読み取ります:「私は中央値を取得し、その後、GROUPBYしたい、それが任意の行のために8以上であるかどうかを確認し、」juanpa.arrivillaga @ –

+0

- ありがとう、あなたは正しい。 – jezrael

+1

私はあなたが 'groupby'に辞書を渡すことができるのか分からなかった...それはクールです! – piRSquared

関連する問題