首页 > 解决方案 > 如何在熊猫中按组计算一组行的模式

问题描述

我有一个看起来像这样的数据框:

import pandas as pd
foo = pd.DataFrame({'var_name': ['r1','r2','r3','var', 'r1','r2','r3','var'],
                    'group': ['a','a','a','a','b','b','b','b'],
                    'value': [1,2,3,4,6,7,8,9]})

value我想要这个数据框中的一个新列,如果大于by所在value行的列的中位数,它将包含 1 ,否则为 0var_name['r1','r2','r3']group

输出数据框应如下所示:

foo = pd.DataFrame({'var_name': ['r1','r2','r3','var', 'r1','r2','r3','var'],
                        'group': ['a','a','a','a','b','b','b','b'],
                        'value': [1,2,3,4,6,7,8,9],
                        'test': [0,0,1,1,0,0,1,1]})

r1,r2,r3输出数据框的解释: for的中位数group a2,所以行r3&在列var中得到 1test

有没有这样做的pythonic方式?

标签: pythonpython-3.xpandas

解决方案


r第一个想法是只过滤由值匹配的行boolean indexing,聚合median和最后一个Series.map组,Series.lt最后转换为0,1Series.view

s = foo[foo['var_name'].isin(['r1','r2','r3'])].groupby('group')['value'].median()

foo['test'] = foo['group'].map(s).lt(foo['value']).view('i1')

或者另一个想法Series.wherefor replace no nmatched values to NaNs 然后创建新Series的用于比较GroupBy.transformand median

foo['test'] = (foo['value'].where(foo['var_name'].isin(['r1','r2','r3']))
                           .groupby(foo['group'])
                           .transform('median')
                           .lt(foo['value'])
                           .view('i1'))

print (foo)

  var_name group  value  test
0       r1     a      1     0
1       r2     a      2     0
2       r3     a      3     1
3      var     a      4     1
4       r1     b      6     0
5       r2     b      7     0
6       r3     b      8     1
7      var     b      9     1

推荐阅读