python - 在使用条件聚合进行分组时选择多个第 n 个值 - 熊猫
问题描述
我有一个四列的 pd.DataFrame
df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2,2]
, 'A':['H','H','E','E','H','E','E','H','H']
, 'B':[4,5,2,7,6,1,3,1,0]
, 'C':['M','D','M','D','M','M','M','D','D']})
id A B C
0 1 H 4 M
1 1 H 5 D
2 1 E 2 M
3 1 E 7 D
4 1 H 6 M
5 2 E 1 M
6 2 E 3 M
7 2 H 1 D
8 2 H 0 D
我想按 id 分组,并为 agg_B1 中的每个 id 的第 n 次(假设第二次)出现 A = 'H' 的 B 值和第 n 次(假设第一次)出现 C = 的 B 值'M':
desired output:
id agg_B1 agg_B2
0 1 5 4
1 2 0 1
desired_output = df.groupby('id').agg(
agg_B1= ('B',lambda x:x[df.loc[x.index].loc[df.A== 'H'][1]])
, agg_B2= ('B',lambda x:x[df.loc[x.index].loc[df.C== 'M'][0]])
).reset_index()
TypeError: Indexing a Series with DataFrame is not supported, use the appropriate DataFrame column
显然,我在索引方面做错了。
编辑:如果可能的话,我想使用带有 lambda 函数的聚合,因为我想同时提取多个其他类型的聚合输出。
解决方案
筛选A
等于的行,然后使用第 n 个函数H
获取第二行:
df.query("A=='H'").groupby("id").nth(1)
A B
id
1 H 5
2 H 0
Python 使用基于零的符号,因此第 2 行将是nth(1)
推荐阅读
- python - Google Analytics Dashboard Data 和通过 python googleapiclient 导入的数据不匹配
- laravel - 如果 esle 条件在 laravel 5.4 中的中间件的构造函数中不起作用
- ios - 如何在 Swift 中打印 Unicode 字符
- javascript - 为什么 async/await 会打破 $http.get/角度摘要循环?
- html - Flex 段落在多行或更长的单词而不是一行时在其右边缘占用更多空间
- javascript - 未捕获的错误:语法错误,无法识别的表达式:不支持的语言:
- debugging - ARFoundation 包的 Unity 编辑器中的平面模拟
- reactjs - 重定向后 React 不做任何事情
- c++ - 许多嵌套 std::conditional_t 的替代品?
- javascript - Can Async Await work without promise ? (Simple example)