【发布时间】:2021-11-22 01:57:54
【问题描述】:
我有一个如下所示的数据框,其中pid 和event_date 是应用groupby 后的索引。这次我想再次申请groupby,只申请pid,适用于两个条件:
- 一个人 (pid=person) 有两个或多个 True 标签;
- 此人的第一个真实实例发生在他/她未满 45 岁;
如果满足上述两个条件,则在 groupby-ed 数据帧中将此人/pid 分配为 True。
age label
pid event_date
00000001 2000-08-28 76.334247 False
2000-10-17 76.471233 False
2000-10-31 76.509589 True
2000-11-02 76.512329 True
... ... ... ...
00000005 2014-08-15 42.769863 False
2015-04-04 43.476712 False
2015-11-06 44.057534 True
2017-03-06 45.386301 True
到目前为止,我只是为了实现第一个条件:
df = (df.groupby(['pid']).apply(lambda x: sum(x['label'])>1).to_frame('label'))
第二个对我来说很棘手。如何以某些列值的第一次出现为条件?非常欢迎任何建议!非常感谢!
使用示例数据框更新:
a = pd.DataFrame(columns=['pid', 'event_date', 'age', 'label'])
a['pid'] = [1, 1, 1, 1, 5, 5, 5, 5]
a['event_date'] = ['2000-08-28', '2000-08-28', '2000-08-28', '2000-08-28',\
'2000-08-28', '2000-08-28', '2000-08-28', '2000-08-28']
a['event_date'] = pd.to_datetime(a.event_date)
a['age'] = [76.334247, 76.471233, 76.509589, 76.512329, 42.769863, 43.476712, 44.057534, 45.386301]
a['label'] = [False, False, True, True, False, False, True, True]
a = (a.groupby(['pid', 'event_date', 'age']).apply(lambda x: x['label'].any()).to_frame('label'))
a.reset_index(level=['age'], inplace=True)
现在如果我申请 (a.groupby(['pid']).apply(lambda x: sum(x['label'])>1).to_frame('label')) 我会得到
label
pid
1 True
5 True
仅满足第一个条件(好吧,因为我跳过了第二个条件)。添加第二个条件应该只标记pid=5 True,因为当第一个label=True 发生时,只有这个人/pid 在 45 岁以下。
【问题讨论】:
-
什么是“人”?你说“一个人有两个或多个 True 标签”,但你怎么知道 N 个 True 标签是否属于同一个人?
-
pid= "人";很抱歉造成混乱! -
这可以实现,因为数据框已经有
pid作为索引列 -
“达到”,抱歉
-
非常感谢!我现在在更新的问题中添加了一个示例数据框!
标签: python pandas pandas-groupby