【问题标题】:Creating a new column based on range values provided in other dataframe根据其他数据框中提供的范围值创建新列
【发布时间】:2019-09-12 03:01:31
【问题描述】:

我有两个数据框,其中一个数据框作为参考表,另一个包含实际值。

>>> reference_table
   MinRange  MaxRange  Multiplier Group
0        10        30           2     A
1        10        40           4     B
2        10        14          10     C
3        15        19           8     C
4        20        24           6     C

>>> df2
  Group  Element  Value
0     A       15      7
1     B       37      8
2     C       12      9
3     C       23     10

在这里,我想在data数据框中创建一个新列Updated Value如下-

>>> data
  Group  Element  Value  Updated Value
0     A       15      7             14
1     B       37      8             32
2     C       12      9             90
3     C       23     10             60

更新值创建如下 -

第 1 行:Element=15 & Group=A,位于 A 组参考表的 MinRange 和 MaxRange 中。因此,Updated Value = Value*Multiplier = 7*2 = 14

第 2 行:Element=37 & Group=B,位于 Group B 参考表的 MinRange 和 MaxRange 中。因此,Updated Value = Value*Multiplier = 8*4 = 32

第 3 行:Element=12 & Group=C,位于 Group C(索引 2)的参考表的 MinRange(10) 和 MaxRange(14) 中。因此,更新值 = 值*乘数 = 9*10 = 90

第 4 行:Element=23 & Group=C,位于 Group C(索引 4)的参考表的 MinRange(10) 和 MaxRange(14) 中。因此,更新值 = 值*乘数 = 10*6 = 60

如何使用 pandas 创建这样的列?我尝试了几种方法,但都没有奏效。很高兴被指出任何参考或类似问题。

【问题讨论】:

  • 我已经编辑了@ScottBoston 的问题

标签: python pandas


【解决方案1】:

mergequery 开头的解决方案:

res = pd.merge(df1, df2, on='Group')
res = res.query('MinRange <= Element <= MaxRange')
res['Updated Value'] = res['Value'] * res['Multiplier']
res = res[['Group', 'Element', 'Value', 'Updated Value']].reset_index(drop=True)

res
  Group  Element  Value  Updated Value
0     A       15      7             14
1     B       37      8             32
2     C       12      9             90
3     C       23     10             60

【讨论】:

  • 您可以使用res[res["Element"].between(res["MinRange"], res["MaxRange"])]避免查询
  • 如果您的dfs 很大,您可以考虑使用dask,除了dd 而不是pd 之外,不要更改代码上的任何内容,其中dd 来自import dask.dataframe as dd
  • @rpanai 谢谢,我根本不知道.between 方法!我喜欢 query 在这种情况下,因为它的可读性,只要它足够快:P
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 2017-01-03
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 2020-04-12
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多