我有一个看起来像这样的数据帧:
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
比var_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 a
的r1,r2,r3
的中值是2
,因此行r3
&var
在test
列中得到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
将未匹配的值替换为NaN
s,然后创建新的Series
以供GroupBy.transform
和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