我正尝试在更大的数据框中添加一个新的true和false列,具体取决于其他列的值组合是否在其他数据框或数组中退出。
我最初尝试过:
Activity = pd.DataFrame(list(itertools.product(ActivityLog1['_created_at$AL'].unique(), _User['_p_user'].unique())),\
columns = ['date','_p_user'])
dft = ActivityLog1[['_created_at$AL','_p_user']].values
Activity['active'] = Activity.apply(lambda x: x[['date','_p_user']].values in dft,axis=1)
但是它花了很长时间,因为有很多数据行,所以我将apply函数更改为:
Activity['active'] = np.where(Activity[['date','_p_user']].values in dft, True, False)
我收到此警告:
C:\Anaconda3\lib\site-packages\ipykernel_launcher.py:6: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.
所有返回的值都是false,这不是true。
Activity[['date','_p_user']].values
返回:
array([[Timestamp('2018-03-27 00:00:00'), 'Y5RKervPy0'],
[Timestamp('2018-03-27 00:00:00'), 'G3zTYHC9qj'],
[Timestamp('2018-03-27 00:00:00'), 'BeLqAK02Zo'],
...,
[Timestamp('2018-09-03 00:00:00'), 'mSEZo8qHe2'],
[Timestamp('2018-09-03 00:00:00'), 'zrERaksxxg'],
[Timestamp('2018-09-03 00:00:00'), '7q6EuwbCgj']], dtype=object)
和
dft
返回:
array([[Timestamp('2018-03-27 00:00:00'), 'BoMRF4HvNg'],
[Timestamp('2018-03-27 00:00:00'), 'B2QoOpL3dZ'],
[Timestamp('2018-03-27 00:00:00'), '7G2jZJbzjT'],
...,
[Timestamp('2018-08-17 00:00:00'), 'dMH2WDsbDY'],
[Timestamp('2018-08-27 00:00:00'), 'sW13lwCQEF'],
[Timestamp('2018-09-03 00:00:00'), 'RAJOMMfWH9']], dtype=object)
还有其他更好和/或更快速的方法来实现这一目标吗?谢谢。
答案 0 :(得分:1)
如何使用indicator
参数进行合并:
Activity = Activitity.merge(dft.drop_duplicates(), indicator='active', how='left')
Activity['active'] = Activity.active.map({'both': True, 'left_only': False})
.drop_duplicates()
用于确保合并后左侧Frame的大小保持不变。如果您确定dft
不包含重复项,则可以将其删除(这将提高速度)。
答案 1 :(得分:0)
这更像是isin
问题
Activity['active']=Activity[['date','_p_user']].apply(tuple,1).isin(dft.apply(tuple,1))