如何解决在`pd.DataFrame`
鉴于一个pd.DataFrame
在不同的组中包含不同的时间序列,我想在所有行上创建一个掩码,该掩码指示每个group
指向time
指向{{1}的最小值}就value
type
而言:
例如,给定0
:
pd.DataFrame
在>>> df
group type time value
0 A 0 0 4
1 A 0 1 5
2 A 1 0 6
3 A 1 1 7
4 B 0 0 11
5 B 0 1 10
6 B 1 0 9
7 B 1 1 8
group
中,A
type
的最小值在0
点time
处达到。对于0
group
,在B
点type
达到了0
time
的最小值。因此,结果列应如下所示:
1
我创建了一个看起来很麻烦的版本,首先找出最小位置,然后构造最后一列:
is_min
0 True
1 False
2 True
3 False
4 False
5 True
6 False
7 True
解决方法
IIUC,您可以尝试使用groupby
+ apply
和min
df['is_min']= df.groupby(['group','type'])['value']
.apply(lambda x: x==x.min())
与此类似,transform
+ min
获得最小值,eq
创建所需的蒙版:
df['is_min']= df.groupby(['group','type'])['value']
.transform('min').eq(df['value'])
输出:
df
group type time value is_min
0 A 0 0 4 True
1 A 0 1 5 False
2 A 1 0 6 True
3 A 1 1 7 False
4 B 0 0 11 False
5 B 0 1 10 True
6 B 1 0 9 False
7 B 1 1 8 True
,
您可以使用排除的merge
删除行。 sort
个值,仅包含"type==0"
和drop_duplicates
的子集,以获取每个组中需要排除的时间。然后与指标合并以排除。
m = (df.sort_values('value').query('type == 0').drop_duplicates('group')
.drop(columns=['type','value']))
# group time
#0 A 0
#5 B 1
df = (df.merge(m,how='outer',indicator=True).query('_merge == "left_only"')
.drop(columns='_merge'))
group type time value
2 A 0 1 5
3 A 1 1 7
4 B 0 0 11
5 B 1 0 9
如果您分别需要遮罩并且不想自动query
来对行进行子集化,请map
指示器
df = df.merge(m,indicator='is_min')
df['is_min'] = df['is_min'].map({'left_only': False,'both': True})
group type time value is_min
0 A 0 0 4 True
1 A 1 0 6 True
2 A 0 1 5 False
3 A 1 1 7 False
4 B 0 0 11 False
5 B 1 0 9 False
6 B 0 1 10 True
7 B 1 1 8 True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。