使用 pandas.DataFrame.apply 查找值并将其替换为来自不同

我有两个具有相同日期时间索引的熊猫数据帧。


第一个是J:


            A     B     C

01/01/10    100   400   200

01/02/10    300   200   400

01/03/10    200   100   300

第二个是K:


             100    200    300    400

01/01/10     0.05  -0.42   0.61  -0.12

01/02/10    -0.23   0.11   0.82   0.34

01/03/10    -0.55   0.24  -0.01  -0.73

我想使用 J 来引用 K 并创建第三个 DataFrame L,如下所示:


             A      B      C

01/01/10     0.05  -0.12  -0.42

01/02/10     0.82   0.11   0.34

01/03/10     0.24  -0.55  -0.01

为此,我需要获取 J 中的每个值并在 K 中查找相应的值,其中列名是同一日期的值。


我试着做:


L = J.apply( lambda x: K.loc[ x.index, x ], axis='index'  )

但得到:


ValueError: If using all scalar values, you must pass an index

理想情况下,我希望使用它,以便 J 中包含的任何 NaN 值将保持原样,并且不会在 K 中查找。我没有成功地尝试过这个:


L = J.apply( lambda x: np.nan if np.isnan( x.astype( float ) ) else K.loc[ x.index, x ]  )



慕容森
浏览 182回答 2
2回答

慕尼黑的夜晚无繁华

使用DataFrame.melt和DataFrame.stack来DataFrame.join映射新值,然后我们将 DataFrame 恢复为原始形状DataFrame.pivot:#if neccesary#K = K.rename(columns = int)L = (J.reset_index()      .melt('index')      .join(K.stack().rename('new_values'),on = ['index','value'])      .pivot(index = 'index',             columns='variable',             values = 'new_values')      .rename_axis(columns = None,index = None)    )print(L)或与DataFrame.lookupL = J.reset_index().melt('index')L['value'] = K.lookup(L['index'],L['value'])L = L.pivot(*L).rename_axis(columns = None,index = None)print(L)输出             A     B     C01/01/10  0.05 -0.12 -0.4201/02/10  0.82  0.11  0.3401/03/10  0.24 -0.55 -0.01我认为这apply可能是一个不错的选择,但我不确定,我建议你看看When should I want use apply in my code

largeQ

用于DataFrame.apply基于DataFrame.lookup标签的索引。# if needed, convert columns of df2 to integers# K.columns = K.columns.astype(int)L = J.apply(lambda x: K.lookup(x.index, x))             A     B     C01/01/10  0.05 -0.12 -0.4201/02/10  0.82  0.11  0.3401/03/10  0.24 -0.55 -0.01
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python