【问题标题】:get median on groups of pandas dataframe获取熊猫数据框组的中位数
【发布时间】:2017-04-01 01:40:52
【问题描述】:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以通过按列交换字典来使用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
    

    【讨论】:

    • 非常好,解决方案读起来几乎像自然语言:“我想分组,然后获取中位数,检查任何行是否大于 8”
    • 我不知道你可以把字典传给groupby...太酷了!
    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多