python - 根据条件选择 GroupBy 之后的一行
问题描述
我有第一个数据框:
df1 = pd.DataFrame({'subject':[2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3],
'trial' :[2,12,13,14,15,16,17,18,3,4,5,9,10,11,12,15],
'diff_rows':['nan',10,1,1,1,1,1,1,'nan',1,1,4,1,1,1,3]})
print(df1)
subject trial diff_rows
0 2 2 nan
1 2 12 10
2 2 13 1
3 2 14 1
4 2 15 1
5 2 16 1
6 2 17 1
7 2 18 1
8 3 3 nan
9 3 4 1
10 3 5 1
11 3 9 4
12 3 10 1
13 3 11 1
14 3 12 1
15 3 15 3
- 我想 GroupBy 主题
- 如果在第 1 行 diff_rows > 1,则选择第 1 行
- 否则,选择第 2 行
- 存储在字典或数据框主题中并试用所选行
我一直在尝试几个选项,但似乎它不起作用,因为 Series 没有 .nth 对象
s = df1.groupby(['subject']).apply(lambda frame: frame.nth(1) if frame.diff_rows.nth(1).gt(1) else frame.nth(2))
s = df1.loc[df1.groupby(['subject']).apply(lambda frame: frame.nth(1) if frame.diff_rows.nth(1).gt(1) else frame.nth(2)), ('subject', 'trial')].to_dict(orient='record')
我的预期输出是:
subject trial diff_rows
0 2 12 10
1 3 5 1
解决方案
根据您的逻辑,我们可以利用该diff_rows
组NaN
第一行的事实:
s1 = df1.diff_rows.eq(1).where(df1.diff_rows.isna().shift())
df1.loc[s1.eq(0) | s1.shift().eq(1)]
输出:
subject trial diff_rows
1 2 12 10.0
10 3 5 1.0
推荐阅读
- async-await - 从任务列表中捕获异常
- java - If Else - Else 在 Java Netbeans 中无法正常工作
- sql - 如何在 SQL Server 中选择最近 7 天的日期
- javascript - 如何使用 Javascript 访问另一个带有空括号(内部没有点)的对象中的对象?
- google-app-maker - Google App Maker - SuggestBox - 小部件的数据源未处于“加载”状态
- spring - 在响应标头中检索令牌时出现问题 - Angular 6 - 后端 Spring
- python - VisPy 中体素的透明度
- jquery - 使用 DTO 对象作为参数将数据提交到 Web API
- android - 无法解析项目:react-native-camera
- python - 将方法应用于熊猫数据框中的几个选定列