簡體   English   中英

比較兩個數據框,然后根據另一個將新列添加到其中一個數據框

[英]Compare two dataframes, and then add new column to one of the data frames based on the other

我需要能夠比較兩個數據幀,一個帶有一列,一個帶有兩列,如下所示:

import numpy as np
import pandas as pd

df_1 = pd.DataFrame(columns=list('AB'))
df_1['A'] = np.random.randint(00,99,size=(5))

df_2  = pd.DataFrame(columns=list('XY'))
df_2['X'] = np.arange(0,100,0.1)
df_2['Y'] = np.cos(df_2['X']) + 30

現在,我想比較df_1 ['A']和df_2 ['X']來找到匹配的值,然后在df_1中創建第二列(aka df_1 ['B']),並使用df_2 ['Y' ],該值對應於匹配的df_2 ['X']值。 有沒有人有辦法解決嗎?

如果數據幀的前兩列之間沒有精確匹配的值,是否有辦法匹配下一個最接近的值(閾值約為5%)?

如OP中所述,如果df_2 ['X']中不存在完全匹配的內容,您可能還希望捕獲與df_1 ['A']列表最接近的值...為此,您可以嘗試以下操作:

根據OP定義df:

df_1 = pd.DataFrame(columns=list('AB'))
df_1['A'] = np.random.randint(00,99,size=(5))

df_2  = pd.DataFrame(columns=list('XY'))
df_2['X'] = np.arange(0,100,0.1)
df_2['Y'] = np.cos(df_2['X']) + 30 #changed "line_x"

首先定義一個函數,該函數將找到最接近的值:

import numpy as np    
def find_nearest(df, in_col, value, out_col): #args = input df (df_2 here), column to match against ('X' here), value to match in in_col (values in df_1['A'] here), column with data you want ('Y' here)
    array = np.asarray(df[in_col])
    idx = (np.abs(array - value)).argmin()
    return df.iloc[idx][out_col]

然后獲取所需的所有df_2 ['Y']值:

matching_vals=[] #declare empty list of matching values from df_2['Y'] to add to df_1['B']
for A in df_1['A'].values: #loop through all df_1['A'] values
    if A in df_2['X']: # if exact match
        matching_vals.append(float(df_2[df_2['X']==A]['Y'])) #append corresponding df_2['Y'] value to list
    else: #no exact match
        matching_vals.append(find_nearest(df_2,'X',A,'Y')) #append df_2['Y'] value with closest match in df_2['X'] column

最后,將其添加到原始df_1中:

df_1['B']=matching_vals

該示例適用於您提供的dfs,但是您可能不得不稍微花一些時間來處理真實數據...

如果您要強制執行5%閾值規則,也可以再添加一個if語句。如果不通過,只需將nan附加到列表中(或最適合您的方法)

df_2.merge(df_1, left_on=['X'], right_on=['A']).rename({'Y':'B', axis='columns')

在將“ Y”重命名為“ B”之后,合並過濾器會過濾df_1['A']df_2['X']之間的公共值。

暫無
暫無

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

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