【问题标题】:Creating a derived field based on df value comparison in python pandaspython pandas中基于df值比较创建派生字段
【发布时间】:2021-07-26 21:09:12
【问题描述】:

我有 2 个数据框 - 一个是数据源数据框,另一个是参考数据框。 我想根据这两个数据框的比较在 df1 中创建一个附加列

df1 - 数据源

No | Name
213344 | Apple
242342 | Orange
234234 | Pineapple

df2 - 参考表

RGE_FROM | RGE_TO | Value
2100 | 2190 | Sweet
2200 | 2322 | Bitter
2400 | 5000 | Neutral

决赛 如果 df1.No 的前 4 个字符介于 df2.RGE_FROM 到 df2.RGE_TO 的范围之间,则获取派生列 df.DESC 的 df2.Value。否则,空白

No | Name | DESC
213344 | Apple | Sweet
242342 | Orange | Natural
234234 | Pineapple | 

感谢任何帮助! 谢谢!

【问题讨论】:

    标签: python-3.x pandas dataframe calculated-columns


    【解决方案1】:

    我们可以从RGE_FROMRGE_TO 列中创建一个IntervalIndex,然后将其设置为Value 列的索引以创建映射系列,然后对No 列中的前四个字符进行切片并使用Series.map 替换映射系列中的值。

    i =  pd.IntervalIndex.from_arrays(df2['RGE_FROM'], df2['RGE_TO'], closed='both')
    df1['Value'] = df1['No'].astype(str).str[:4].astype(int).map(df2.set_index(i)['Value'])
    

           No       Name    Value
    0  213344      Apple    Sweet
    1  242342     Orange  Neutral
    2  234234  Pineapple      NaN
    

    【讨论】:

    • 问题:当系列类型实际上是 int 时,Series.map 如何知道使用 IntervalIndex 作为键而不是 int?可能 map 实现会查看索引类型,看看它的 IntervalIndex 是否,查看 int 是否在范围内并映射它?
    • @SomeDude 完全正确!为了替换值,映射操作通常将列中的值匹配到映射系列中相应的匹配索引值。但是如果映射系列的索引是IntervalIndex,那么映射操作会尝试匹配区间范围内的列中的值。
    • 嗨@ShubhamSharma!谢谢您的答复。我收到错误消息 - “IntervalIndex 不支持类别、对象和字符串子类型”
    • @yuzu 我们需要将列 RGE_FROM 和 RGE_TO 的数据类型更改为整数类型,然后再从它们创建区间索引。
    • @ShubhamSharma,我无法将其转换为整数类型。 df2['RGE_FROM'].astype(int)。这是正确的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2020-11-26
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多