【发布时间】:2015-02-01 02:33:06
【问题描述】:
在第一个数据帧中,最后两列(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 中查询/搜索/引用,在 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 的第 78 页)来处理 python 列表中的边界。所以我定义了一个这样的绑定函数。
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) 任何帮助将不胜感激。我对 phase_one 和 phase_two 使用了 biopython,对 phase_three 使用了 pandas,我不太确定对于这个最后阶段,什么是最好的库。
(c) 很明显我是一个业余程序员。
【问题讨论】:
-
“NumPy 仅适用于数字/矩阵”——不。记录/结构化数组可以有不同类型的列,如数据框
-
我不明白解决方案的格式。 df1 中的每一行是否只匹配 df2 中的最多 1 行?
-
是的,这是正确的; df2 是巨大的,大得多。我正在查找一个匹配项,其中两个数值都在各自条目的 0.3 公差范围内。然后返回一个匹配项并打印满足公差及其相应强度的两个值。