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

时间:2015-01-31 00:06:48

标签: python numpy pandas

在第一个数据帧中,最后两列(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中为df1中的每个猜测提供一种方法,在df1的初始猜测的0.300范围内进行查询/搜索/参考。然后我希望在新的数据帧中返回,比方说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)

我当时认为我可以按照此处使用的逻辑(https://stackoverflow.com/a/14717374/3767980)添加新列。

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

- 我真的很难接受这个陈述

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

(2)为上限和下限创建新列,然后运行条件以查看值是否在两列之间。

最后:

(a)你认为我应该留在熊猫吗?或者我应该转移到NumPy或SciPy或只是传统的python数组/列表。我在想是一个常规的python列表列表。因为我也有文字,所以我害怕NumPy,NumPy只对数字/矩阵有效。

(b)任何帮助将不胜感激。我使用了biopython用于phase_one和phase_two,pandas用于phase_three,我对这个最后阶段不太确定,这里使用的是最好的库。

(c)我可能很明显我是业余的程序员。

1 个答案:

答案 0 :(得分:1)

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

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