Pandas Datframe1 在 Dataframe2 的范围内搜索匹配项

Pandas Datframe1 search for match in range of Dataframe2

在第一个数据框中,最后两列(shift_one 和 shift_two)可以被认为是对潜在真实坐标的猜测。称这个为 df1。

df1:

         p_one     p_two            dist  shift_one  shift_two
0        Q8_CB      Q2_C  d_6.71823_Angs     26.821    179.513
1        Q8_CD      Q2_C  d_4.72003_Angs    179.799    179.514
....

在第二个数据帧中,称之为 df2,我有一个实验观察坐标的数据帧,我表示峰值。它只是坐标和表示信号强度的另一列,这只需要随行。

df2:

            A        B        C
0      31.323   25.814   251106
1      26.822   26.083   690425
2      27.021   179.34  1409596
3      54.362   21.773  1413783
4      54.412   20.163   862750
....

我的目标是为 df1 中的每个猜测提供一种方法,使其在 df2 中为 queried/searched/refrenced,在 df1 中初始猜测的 0.300 范围内。然后我希望它在一个新的 datframe 中返回,比如说 df3。在这种情况下,我们注意到 df1 的第 0 行与 df2 的第 2 行 匹配

期望的输出,df3:

         p_one     p_two            dist  shift_one  shift_two  match  match1  match2  match_inten
0        Q8_CB      Q2_C  d_6.71823_Angs     26.821    179.513   TRUE  27.021  179.34      1409596
1        Q8_CD      Q2_C  d_4.72003_Angs    179.799    179.514    NaN     NaN     NaN          NaN
....

我尝试了一些事情:

(1) O'Reily 建议使用 lambda 或 def 处理 python 列表中的边界(简而言之,python 第 78 页)。所以我定义了一个这样的绑定函数。

def bounds (value, l=low, h=high)

当时我想我可以按照此处使用的逻辑添加一个新列 ()。

df1['match'] = ((df2['A'] + 0.3 <= df1['shift_one']) or (df2['A'] + 0.3 => df1['shift_one'])

--我真的很纠结这个说法

接下来我将提取值,这应该是微不足道的。

(2) 新建上下限列,然后运行一个条件判断值是否在两列之间

最后:

(a) 你觉得我应该留在pandas吗?或者我应该转向 NumPy 或 SciPy 还是传统的 python arrays/lists。我在想一个常规的 python 列表列表。我害怕 NumPy,因为我也有文本,NumPy 仅供 numbers/matrices 使用。

(b) 如有任何帮助,我们将不胜感激。我将 biopython 用于 phase_one 和 phase_two,pandas 用于 phase_three,我不太确定最后阶段最好的库是什么使用。

(c) 很明显我是一名业余程序员。

以下假定要比较的列具有相同的名称。

def temp(row):
    index = df2[((row-df2).abs() < .3).all(axis=1)].index
    return df2.loc[index[0], :] if len(index) else [None]*df2.shape[1]

例如

df1 = pd.DataFrame([[1,2],[3,4], [5,6]], columns=["d1", "d2"])
df2 = pd.DataFrame([[1.1,1.9],[3.2,4.3]], columns=["d1", "d2"])
df1.apply(temp, axis=1)

生产

    d1   d2
0  1.1  1.9
1  3.2  4.3
2  NaN  NaN