我有两个数据框,其中一个具有userId和gender,另一个数据框具有这些用户的在线活动。
第一个数据框 (df1)
userId, gender
001, F
002, M
003, F
004, M
005, M
006, M
第二数据框 (df2)
userId, itemClicked, ItemBought, date
001, 123182, 123212, 02/02/2016
003, 234256, 123182, 05/02/2016
005, 986834, 234256, 04/19/2016
004, 787663, 787663, 05/12/2016
020, 465738, 465738, 03/20/2016
004, 787223, 787663, 07/12/2016
我想通过基于userId查找第一个数据框来将性别列添加到第二个数据框。df2每个用户可能会有多行,因为df2是一个点击数据,而同一用户可能有多个项目。
这在MySql中很容易做到,但是我试图在熊猫中做到这一点。
for index, row in df2.iterrows():
user_id = row['userId']
if user_id in df1['userId']:
t = df1.loc[df1['userId'] == user_id]
pdb.set_trace()
这是熊猫这样的任务吗?
print (df1)
userId gender
0 1 F
1 2 M
2 3 F
3 4 M
4 5 M
5 6 M
print (df2)
userId itemClicked ItemBought date
0 1 123182 123212 02/02/2016
1 3 234256 123182 05/02/2016
2 5 986834 234256 04/19/2016
3 4 787663 787663 05/12/2016
4 20 465738 465738 03/20/2016
5 4 787223 787663 07/12/2016
您可以使用map
:
df2['gender'] = df2.userId.map(df1.set_index('userId')['gender'].to_dict())
print (df2)
userId itemClicked ItemBought date gender
0 1 123182 123212 02/02/2016 F
1 3 234256 123182 05/02/2016 F
2 5 986834 234256 04/19/2016 M
3 4 787663 787663 05/12/2016 M
4 20 465738 465738 03/20/2016 NaN
5 4 787223 787663 07/12/2016 M
如果两个DataFrames中只有一列相同,则可以省略merge
和保留左联接参数的另一种解决方案:on
gender
df = pd.merge(df2, df1, how='left')
print (df)
userId itemClicked ItemBought date gender
0 1 123182 123212 02/02/2016 F
1 3 234256 123182 05/02/2016 F
2 5 986834 234256 04/19/2016 M
3 4 787663 787663 05/12/2016 M
4 20 465738 465738 03/20/2016 NaN
5 4 787223 787663 07/12/2016 M
时间:
#len(df2) = 600k
df2 = pd.concat([df2]*100000).reset_index(drop=True)
def f(df1,df2):
df2['gender'] = df2.userId.map(df1.set_index('userId')['gender'].to_dict())
return df2
In [43]: %timeit f(df1,df2)
10 loops, best of 3: 34.2 ms per loop
In [44]: %timeit (pd.merge(df2, df1, how='left'))
10 loops, best of 3: 102 ms per loop
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句