繁体   English   中英

如果值在 df1 的范围内,Pandas 会将标签从 df1 应用到 df2

[英]Pandas apply labels from df1 to df2 if values are within a range in df1

我有两个数据框,df1 和 df2。 df1 是在范围之间设置的标签表:

    Top    Bottom    Label    ID
0   0.0    2.2       A        Z-1
1   2.2    6.6       B        Z-1
2   6.6    9.1       C        Z-1
3   0.0    1.2       A        Z-2
4   1.2    4.5       B        Z-2
5   6.6    9.1       C        Z-2

其中 ID 列与更高阶的分组相关。 df1 和 df2 都包含共享 ID,我想将标签从 df1 应用到 df2。

df2 是定期采样数据的表:

    Samp   Var    ID
0   0.0    157    Z-1
1   0.5    226    Z-1
2   1.5    843    Z-1
3   2.0    999    Z-1
4   2.5    142    Z-1
5   3.0    167    Z-1
6   0.0    157    Z-2
7   0.5    226    Z-2
8   1.5    111    Z-2
9   2.0    666    Z-3

所需的输出如下所示:

    Samp   Var    ID    Label
0   0.0    157    Z-1   A
1   0.5    226    Z-1   A
2   1.5    843    Z-1   A
3   2.0    999    Z-1   A
4   2.5    142    Z-1   B
5   3.0    167    Z-1   B
6   0.0    157    Z-2   A
7   0.5    226    Z-2   A
8   1.5    111    Z-2   B
9   2.0    666    Z-3   B

我在寻找其他答案时遇到的问题是我首先需要匹配 ID,然后在顶部和底部列之间的范围内应用标签。 任何帮助,将不胜感激!

这是一种方法 Z-3 不存在于您的参考表中,因此它为空。

想法是在 ID 上合并,然后查询 Samp 在该范围内的那些,然后它只是对结果集的清理

df2.merge(df, on='ID', how='left', suffixes=("","_y")
         ).query('(Samp>=Top & Samp<=Bottom) | Label.isna()'
                ).reset_index().drop(
                                columns=['index','Top','Bottom']
)
    Samp    Var     ID  Label
0   0.0     157     Z-1     A
1   0.5     226     Z-1     A
2   1.5     843     Z-1     A
3   2.0     999     Z-1     A
4   2.5     142     Z-1     B
5   3.0     167     Z-1     B
6   0.0     157     Z-2     A
7   0.5     226     Z-2     A
8   1.5     111     Z-2     B
9   2.0     666     Z-3     NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM