【发布时间】:2019-08-27 18:28:45
【问题描述】:
我有一个如下所示的数据框
df1 = pd.DataFrame({'subject_id' :[1,1,1,1,1,1,1,2,2,2,2],'day':[3,7,9,10,11,19,20,7,13,18,22] , 'fake_flag' :['fake VAC','','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC']})
如下图所示
我想根据以下规则在actual_flag 列中填写值
a) fake_flag 的值应为 fake_vac 且不应为空
b) 仅填写出现fake_vac 的第一天和14 days interval 之后的记录的值。
这是我尝试过的
t = df1[df1['fake_flag'] == 'fake VAC']
sub_list = t['subject_id'].unique().tolist()
for sub in sub_list:
day_list = t['day'][t['subject_id']==sub].tolist()
min_value = min(day_list)
index = t[t['day']==min_value].index
df1.loc[index, 'actual_flag'] = 'act_vac'
i_14day = min_value + 14
day_values = [i for i in day_list if i >= i_14day]
print("day greater than 14 are ", day_values)
if len(day_values) > 0:
for val in day_values:
index = t[t['day']==val].index
df1.loc[index, 'actual_flag'] = 'act_vac'
如您所见,这非常冗长,我无法对百万条记录的数据集执行此操作。任何有效而优雅的方法都是有帮助的
我希望我的输出如下所示
在这种情况下,对于 subject_id = 1,day 3 是第一次出现 fake vac,day 19(19 是 gt > 14 天的间隔从 3)和 day 20(20 是 > 14 天的间隔3) 间隔 14 天后。任何优雅高效的解决方案都会有所帮助
用于测试的样本数据
df1 = pd.DataFrame({'subject_id' :[1,1,1,1,1,1,1,1,2,2,2,2],'day':[2,3,7,9,10,11,19,20,7,13,18,22] , 'fake_flag' :['','fake VAC','','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC','fake VAC']})
**更新截图**
【问题讨论】:
-
我不希望遍历所有主题或记录来为我的数据集执行此操作。它有超过一百万条记录,并且会非常慢
标签: python python-3.x pandas