根据具有共享列的另一个数据框在数据框中查找值的首次出现

时间:2018-09-04 17:32:36

标签: python pandas

我试图基于具有相同标识符的另一个数据帧的值来查找首次超过阈值的值。在下面的示例中,“跟踪”列将是相同的标识符。但是,第二数据帧对于每个“跟踪”编号仅包含一个值。目的是找到df1的“ Signal”列超过df2的“ Signal”列2倍的第一次出现。另外,我想将其余信息保留在符合给定条件的行中。

df1 = {"Trace": [1,1,1,1,1,2,2,2,2,2], "Sample": [1,2,3,4,5,1,2,3,4,5], "Signal": [2,3,5,6,1,8,9,5,4,3]}

df2 = {"Trace": [1,2], "Sample": [4,2], "Signal": [2,4]}

例如,在给定的情况下,我想创建一个新的数据框(df3),其中包含实例,其中df2中的“ Signal”列超出了df2中原始“ Signal”的2倍(分别为4和6) )。因此,新数据帧(df3)将包含“跟踪”值1和2,“采样”值3和2,以及“信号”值5和9。

有什么想法吗?我曾尝试使用.groupby和.loc,但是似乎无法获得想要的东西。

1 个答案:

答案 0 :(得分:0)

import pandas as pd

df1 = pd.DataFrame({
    "Trace": [1,1,1,1,1,2,2,2,2,2],
    "Sample": [1,2,3,4,5,1,2,3,4,5],
    "Signal": [2,3,5,6,1,8,9,5,4,3],
})
df2 = pd.DataFrame({
    "Trace": [1,2],
    "Sample": [4,2],
    "Signal": [2,4]},
)

df3 = df1.merge(
    df2[['Trace', 'Signal']],
    on='Trace'
)
mask = (df3.Signal_x > 2 * df3.Signal_y)
df3 = df3.loc[mask]

mask = ~df3.duplicated('Trace')
df3 = df3.loc[mask]

其中生成的df3应该如下所示:

   Trace  Sample    Signal_x    Signal_y
2      1       3           5           2
6      2       2           9           4