【问题标题】:Pandas Datframe1 search for match in range of Dataframe2Pandas Datframe1 在 Dataframe2 范围内搜索匹配项
【发布时间】: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 公差范围内。然后返回一个匹配项并打印满足公差及其相应强度的两个值。

标签: python numpy pandas


【解决方案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

【讨论】:

  • 谢谢,这对我很有帮助,我的脚本正在运行。
  • @PhysicalChemist 太棒了!很高兴它解决了问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2021-09-05
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多