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