Python 比较两个数据帧,然后基于另一个数据帧向其中一个数据帧添加新列

Python 比较两个数据帧,然后基于另一个数据帧向其中一个数据帧添加新列,python,pandas,numpy,Python,Pandas,Numpy,我需要能够比较两个数据帧,一个带一列,一个带两列,如下所示: 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

我需要能够比较两个数据帧,一个带一列,一个带两列,如下所示:

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(也称为df_1['B'])中创建第二列,其中df_2['Y']中的值对应于匹配的df_2['X']值。有人有解决办法吗

如果数据帧的前两列之间没有精确的匹配值,是否有方法匹配下一个最接近的值(阈值为~5%)?

dfu 2.merge(dfu 1,left_on=['X'],right_on=['a'])。重命名({'Y':'B',axis='columns'))

合并过滤
df_1['A']
df_2['X']
之间的公共值,并在将“Y”重命名为“B”后。

如OP中所述,如果df_2['X']中没有精确匹配,您可能还需要捕获与df_1['A']列表最接近的值……为此,您可以尝试以下操作:

根据OP定义您的dfs:

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添加到列表中(或任何最适合您的语句)

由于某些原因,我在第一行遇到了无效的语法错误。真的吗?我在粘贴之前尝试过。可能是格式或某些东西弄乱了。我会再次检查它。粘贴时,间距弄乱了,我更正了它,并包含了我定义dfs的第一位代码,我更改了您的“line_x”因为它没有定义…我想你是指df_2['X']..再次运行它,它工作了。你是对的。我也修复了原来的帖子。谢谢你的关注