在第一个数据帧中,最后两列(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)我可能很明显我是业余的程序员。
答案 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