如何在Panda中按组计算一组行的模式



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

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]})

我希望在这个数据帧中有一个新列,如果valuevar_name['r1','r2','r3']中的行的value列的中值大group,则它将包含1,否则为0

输出数据帧应该看起来像:

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]})

输出数据帧说明:group ar1,r2,r3的中值是2,因此行r3&vartest列中得到1

有蟒蛇式的方法吗?

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

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.where将未匹配的值替换为NaNs,然后创建新的Series以供GroupBy.transformmedian:比较

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

最新更新