python - pandas groupby,上下组成员的区别
问题描述
假设我有df
:
df = pd.DataFrame({'ID': ['a', 'b', 'b', 'b', 'c', 'c'],
'V1': [1,2,3,4,5,6],
'V2': [7,8,9,19,11,12]})
我想创建一个新列,指示“顶部”组成员和“底部”组成员V3
之间的区别。结果将如下所示:V2
V1
ID V1 V2 V3
0 a 1 7 6
1 b 2 8 4
2 b 3 9 4
3 b 4 19 4
4 c 5 11 5
5 c 6 12 5
我尝试了这样的方法,但它不起作用:
df.groupby('ID').apply(lambda x: x.head(1).V2-x.tail(1).V1)
解决方案
使用GroupBy.transform
withfirst
和last
减去 by Series.sub
:
df['V3'] = df.groupby('ID').V2.transform('first').sub(df.groupby('ID').V1.transform('last'))
您的解决方案应通过选择位置和来更改Series.map
:
s = df.groupby('ID').apply(lambda x: x.V2.iat[0]-x.V1.iat[-1])
df['V3'] = df['ID'].map(s)
print (df)
ID V1 V2 V3
0 a 1 7 6
1 b 2 8 4
2 b 3 9 4
3 b 4 19 4
4 c 5 11 5
5 c 6 12 5
推荐阅读
- ruby-on-rails - 如何将 ID 提供给其他控制器:没有将 Symbol 隐式转换为 Integer 错误
- javascript - AngularJS 在 Chrome、IE、Mozilla 和 Edge 上运行良好,但在 IE11 中无法运行
- flutter - 颤振键盘隐藏不适用于标签点击
- android - 如何在多个视图周围绘制一个矩形
- php - 如何从php检索变量到android?
- python - 提取带有“数字字符串数字数字”的行并将其写入数据框
- unit-testing - 组件渲染函数中的Vue无限更新循环
- r - 如何在所有excel文件中找到确切的工作表数
- html - 宽度:最大内容,宽度:适合内容在 Edge 中不起作用
- docker - Docker-compose 级联构建镜像