获得大熊猫数据帧组的中位数

时间:2017-03-31 17:29:22

标签: python pandas

我希望能够计算数据帧中列组的中位数。我有以下示例数据帧。对于我的实际数据帧,列数,列和组的名称是动态的,因为它取决于用户输入。

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

显然,中间步骤应该是计算两组的中位数:

     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

1 个答案:

答案 0 :(得分:8)

您可以按列交换dict使用groupby,汇总median并与any进行比较,每行至少有一个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