pandas group by - return 分组中满足条件的第一行
pandas groupby - return the first row in a group that mets a condition
给出下面的示例数据集,我想 return 每行 group
显示第一行的 obsnum
score
小于 0.4 .
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'],
'obsnum': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
'score' : np.random.rand(12)})
数据框如下所示:
df
group obsnum score
0 a 1 0.374540
1 a 2 0.950714
2 a 3 0.731994
3 a 4 0.598658
4 b 1 0.156019
5 b 2 0.155995
6 b 3 0.058084
7 b 4 0.866176
8 c 1 0.601115
9 c 2 0.708073
10 c 3 0.020584
11 c 4 0.969910
return编辑的结果应该是这样的,并存储在另一个数据框中。
group obsnum score
a 1 0.374540
b 1 0.156019
c 3 0.020584
我试过这个 df.groupby('group').apply(lambda x: x['score'] <= 0.4)
和这个 df.groupby('group')['obsnum', 'score'].min()
但都不是我想要的。
您可以使用 boolean indexing
or query
for filter first and then drop_duplicates
:
df = df[df['score'] <= 0.4].drop_duplicates('group')
df = df.query('score <= 0.4').drop_duplicates('group')
print (df)
group obsnum score
0 a 1 0.374540
4 b 1 0.156019
10 c 3 0.020584
您可以使用
df[df['score'].le(0.4)].groupby('group').first()
obsnum score
group
a 1 0.374540
b 1 0.156019
c 3 0.020584
给出下面的示例数据集,我想 return 每行 group
显示第一行的 obsnum
score
小于 0.4 .
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'],
'obsnum': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
'score' : np.random.rand(12)})
数据框如下所示:
df
group obsnum score
0 a 1 0.374540
1 a 2 0.950714
2 a 3 0.731994
3 a 4 0.598658
4 b 1 0.156019
5 b 2 0.155995
6 b 3 0.058084
7 b 4 0.866176
8 c 1 0.601115
9 c 2 0.708073
10 c 3 0.020584
11 c 4 0.969910
return编辑的结果应该是这样的,并存储在另一个数据框中。
group obsnum score
a 1 0.374540
b 1 0.156019
c 3 0.020584
我试过这个 df.groupby('group').apply(lambda x: x['score'] <= 0.4)
和这个 df.groupby('group')['obsnum', 'score'].min()
但都不是我想要的。
您可以使用 boolean indexing
or query
for filter first and then drop_duplicates
:
df = df[df['score'] <= 0.4].drop_duplicates('group')
df = df.query('score <= 0.4').drop_duplicates('group')
print (df)
group obsnum score
0 a 1 0.374540
4 b 1 0.156019
10 c 3 0.020584
您可以使用
df[df['score'].le(0.4)].groupby('group').first()
obsnum score
group
a 1 0.374540
b 1 0.156019
c 3 0.020584