np.where无法正常工作,需要更快的方法来应用熊猫

时间:2018-09-24 16:59:09

标签: python pandas numpy

我正尝试在更大的数据框中添加一个新的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)

还有其他更好和/或更快速的方法来实现这一目标吗?谢谢。

2 个答案:

答案 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))