簡體   English   中英

基於兩列在其他 DataFrame 中查找值

[英]Lookup values in other DataFrame based on two columns

我嘗試通過使用df1映射二維(列) Dates & IDDataFrame df2中創建一個新列X2 所以這是一種基於兩個條件的查找。 到目前為止,我只知道如何基於一維 map。

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')

非常感謝!

給定數據幀,

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]})

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]})

我們可以將df1的索引設置為Dates並簡單地按索引和列查找相應的值:

df1 = df1.set_index('Dates')
df1 = df1.replace('NaN',np.nan)
df['X2'] = df2.apply(lambda x: df1.loc[x['Dates'], x['ID']], axis=1)

另一種選擇是unstack df1並創建一個系列。 然后將df2set_index設置為DatesID作為 MultiIndex 並使用該 MultiIndex 過濾來自未堆疊系列的相關數據:

df1_data = df1.unstack().swaplevel(1,0)
df['X2'] = df1_data[df2.set_index(['Dates','ID']).index].to_numpy()

Output:

   A  B  C   X2
0  a  1  2  4.2
1  b  3  4  3.5
2  c  5  6  0.1
3  a  1  2  2.5
4  b  3  4  8.2
5  c  5  6  4.2

您可以melt df1 以將其重塑為長格式,然后在“日期”和“ID”上將 output merge到 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')

output:

             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

您可以使用融化,而不使用索引:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM