python - 基于两列在其他 DataFrame 中查找值

标签 python pandas dataframe

我尝试通过映射两个维度(列)日期DataFrame df2中创建一个新列X2 & IDdf1。所以这是一种基于两个条件的查找。到目前为止,我只知道如何基于一维进行映射。

df1:
            01K 02K 03K 04K
Dates               
2021-01-01  4.2 3.5 4.2 NaN
2021-01-02  2.3 0.1 5.2 2.6
2021-01-03  0.3 NaN 2.5 8.2
2021-01-04  0.4 NaN 3.0 4.2

df2:
            ID  X1
Dates       
2021-01-01  01K 3.5
2021-01-01  02K 1.1
2021-01-02  02K 2.1
2021-01-03  03K 4.2
2021-01-03  04K 3.1
2021-01-04  04K 2.7

df2_new:
            ID  X1  X2
Dates           
2021-01-01  01K 3.5 4.2
2021-01-01  02K 1.1 3.5
2021-01-02  02K 2.1 0.1
2021-01-03  03K 4.2 2.5
2021-01-03  04K 3.1 8.2
2021-01-04  04K 2.7 4.2

为了重现性:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K':[4.2, 2.3, 0.3, 0.4], 
    '02K':[3.5, 0.1, 'NaN', 'NaN'], 
    '03K':[4.2, 5.2, 2.5, 3.0], 
    '04K':['NaN', 2.6, 8.2, 4.2]})
df1 = df1.replace('NaN',np.nan)
df1 = df1.set_index('Dates')

df2 = pd.DataFrame({
    'Dates':['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-03', '2021-01-03', '2021-01-04'],
    'ID':['01K', '02K', '02K', '03K', '04K', '04K'], 
    'X1':[3.5, 1.1, 2.1, 4.2, 3.1, 2.7]})
df2 = df2.set_index('Dates')

非常感谢!

最佳答案

您可以melt df1 将其 reshape 为长格式,并保留 merge在“日期”和“ID”上输出到 df2:

df1_melt = df1.reset_index().melt(id_vars='Dates', var_name='ID', value_name='X2')
df2.merge(df1_melt, on=['Dates', 'ID'], how='left').set_index('Dates')

输出:

             ID   X1   X2
Dates                    
2021-01-01  01K  3.5  4.2
2021-01-01  02K  1.1  3.5
2021-01-02  02K  2.1  0.1
2021-01-03  03K  4.2  2.5
2021-01-03  04K  3.1  8.2
2021-01-04  04K  2.7  4.2

关于python - 基于两列在其他 DataFrame 中查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70708853/

相关文章:

python - PyautoGui 3.6 导入错误

python - 使用 read() 方法从 Amazon S3 读取大型 JSON 文件时出现内存错误

python - 将包含 Pandas DataFrame 列表列表的单元格解包到新 DataFrame 的单独行和列中

python - Pandas 根据工作日过滤数据框

python - 禁止打印 pytest 的标题

python - id 是 python 内置函数吗?

python - 如何使用 pandas crosstab 获得交叉表来显示列变量的多个值的频率?

python - 如何在 Pandas 数据框中设置每日频率?

python - 如何按最大日期时间过滤数据框中的行?

Python:通过将键的所有值组合成 1 行来解析 CSV 并存储新的数据帧