Python 使用pandas.DataFrame.apply查找值并将其替换为来自不同数据帧的值

Python 使用pandas.DataFrame.apply查找值并将其替换为来自不同数据帧的值,python,pandas,Python,Pandas,我有两个具有相同日期时间索引的数据帧 第一个是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.

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

第一个是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,并创建第三个数据帧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 ]  )
使用和来映射新值,然后使用以下命令将数据帧返回到原始形状:


或与

输出

             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
我认为
apply
可能是一个不错的选择,但我不确定, 我建议您查看

使用和使用来映射新值,然后使用以下命令将数据帧返回到原始形状:


或与

输出

             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
我认为
apply
可能是一个不错的选择,但我不确定, 我建议您查看使用进行基于标签的索引

# if needed, convert columns of df2 to integers
# K.columns = K.columns.astype(int)
L = J.apply(lambda x: K.lookup(x.index, x))
用于基于标签的索引

# if needed, convert columns of df2 to integers
# K.columns = K.columns.astype(int)
L = J.apply(lambda x: K.lookup(x.index, x))

数据帧J和K具有相同数量的行和列?它们共享相同的索引,因此将具有相同数量的行。但是,J的列数将少于K。请在示例数据中表示这一点。现在它们都有相同数量的列。更新了示例数据。现在应该更清楚了。您的数据帧J和K具有相同数量的行和列?它们共享相同的索引,因此将具有相同数量的行。但是,J的列数将少于K。请在示例数据中表示这一点。现在它们都有相同数量的列。更新了示例数据。现在应该更清楚了。
             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