python - 如何在熊猫中按组计算一组行的模式
问题描述
我有一个看起来像这样的数据框:
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 a
是2
,所以行r3
&在列var
中得到 1test
有没有这样做的pythonic方式?
解决方案
r
第一个想法是只过滤由值匹配的行boolean indexing
,聚合median
和最后一个Series.map
组,Series.lt
最后转换为0,1
值Series.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.where
for replace no nmatched values to NaN
s 然后创建新Series
的用于比较GroupBy.transform
and 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
推荐阅读
- spring-boot - 多数据源配置的 Spring Boot 1.5.18 无法使用 HikariCP
- javascript - 如何等待 window.performance.timing 中的所有值都被定义
- xamarin - 使用 Environment 访问 Android 特殊文件夹路径
- python - matplotlib:多个子图未强制执行轴刻度标签对齐
- xcode - Xcode watch '无效的表达式'
- c# - XmlReader - 如何在没有 System.OutOfMemoryException 的情况下读取元素中很长的字符串
- c++ - 如何将指向指针列表的私有指针作为const返回?
- git - Windows 10 上的 Git Bash 忽略 Ctrl + C
- ios - 为原生 iOS 应用程序创建 Jitsi Meet 框架并集成到 Xcode 项目中
- javascript - 如何从 LabView(或其他应用程序)自动填充的 HTML 字段中获取值?