我有两个df
,A
和B
。 A
就像,
date id
2017-10-31 1
2017-11-01 2
2017-08-01 3
B
就像,
type id
1 1
2 2
3 3
我想为has_b
创建一个新的布尔列A
,如果其对应的行(True
加入A
,则将列值设置为B
id
中的B
}没有type == 1
,其时间差值为>与datetime.utcnow().day
相比90天;和False
否则,这是我的解决方案
B = B[B['type'] != 1]
A['has_b'] = A.merge(B[['id', 'type']], how='left', on='id')['date'].apply(lambda x: datetime.utcnow().day - x.day > 90)
A['has_b'].fillna(value=False, inplace=True)
希望看到A
结果,
date id has_b
2017-10-31 1 False
2017-11-01 2 False
2017-08-01 3 True
我想知道是否有更好的方法可以做到这一点,就更简洁高效的代码而言。
答案 0 :(得分:1)
首先在A
-
B
和id
i = A.merge(B, on='id')
现在,计算has_b
-
x = i.type.ne(1)
y = (pd.to_datetime('today') - i.date).dt.days.gt(90)
i['has_b'] = (x & y)
合并i
和A
-
C = A.merge(i[['id', 'has_b']], on='id')
C
date id has_b
0 2017-10-31 1 False
1 2017-11-01 2 False
2 2017-08-01 3 True
<强>详情
x
将为第一个条件返回一个布尔掩码。
i.type.ne(1)
0 False
1 True
2 True
Name: type, dtype: bool
y
将为第二个条件返回一个布尔掩码。使用to_datetime('today')
获取当前日期,从日期列中减去此日期,然后使用dt.days
访问days组件。
(pd.to_datetime('today') - i.date).dt.days.gt(90)
0 False
1 False
2 True
Name: date, dtype: bool
如果A
和B
的ID不对齐,您可能需要左合并而不是内部合并,最后一步 -
C = A.merge(i[['id', 'has_b']], on='id', how='left')
在这种情况下, C的has_b
列将包含NaN。