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
在第一个数据框中,最后两列(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