python - 使用 Python Pandas 根据第二个 df 中定义的 bins 在一个 df 中对数据进行 bin

标签 python join pandas dataframe binning

我正在尝试根据第二个数据框中定义的 bin 将数据放入一个 dataframe 中。我在想 pd.bin 和 pd.merge 的某种组合可能会让我到达那里?

这基本上是每个数据框当前的形式:

df = pd.DataFrame({'id':['a', 'b', 'c', 'd','e'],
                   'bin':[1, 2, 3, 3, 2],
                   'perc':[0.1,0.9,0.3,0.7,0.5]})

df2 = pd.DataFrame({'bin':[1, 1, 1, 2, 2, 2, 3, 3, 3], 
                    'result':['low', 'medium','high','low', 'medium','high','low', 'medium','high'],
                    'cut_min':[0,0.2,0.6,0,0.3,0.7,0,0.4,0.8],
                    'cut_max':[0.2,0.6,1,0.3,0.7,1,0.4,0.8,1]})

df:

bin id  perc
1   a   0.1
2   b   0.9
3   c   0.3
3   d   0.7
2   e   0.5

这是带有 bins 的表,df2:

bin cut_max cut_min result
1   0.2     0.0     low
1   0.6     0.2     medium
1   1.0     0.6     high
2   0.3     0.0     low
2   0.7     0.3     medium
2   1.0     0.7     high
3   0.4     0.0     low
3   0.8     0.4     medium
3   1.0     0.8     high

我想匹配 bin,并使用包含 df 中的 perc 值的 cut_min 和 cut_max 在 df2 中找到合适的结果。所以,我希望结果表看起来像这样:

bin id  perc    result
1   a   0.1     low
2   b   0.9     high
3   c   0.3     low
3   d   0.7     medium
2   e   0.5     medium

我最初是在 SQL 查询中写的,它通过一个连接非常简单地完成了任务:

select
  df.id
  , df.bin
  , df.perc
  , df2.result
from df
inner join df2
  on df.bin = df2.bin
  and df.perc >= df2.cut_min 
  and df.perc < df2.cut_max

如果有人知道使用 Pandas 执行此操作的好方法,将不胜感激! (这实际上是我第一次无法仅在 stackoverflow 上搜索找到解决方案,所以如果以上任何内容解释得不够好,我深表歉意!)

最佳答案

第一个merge df and df2 bin 上列,然后是 select the rows其中 cut_min <= perc < cut_max :

In [95]: result = pd.merge(df, df2, on='bin').query('cut_min <= perc < cut_max'); result
Out[95]: 
    bin id  perc  cut_max  cut_min  result
0     1  a   0.1      0.2      0.0     low
5     2  b   0.9      1.0      0.7    high
7     2  e   0.5      0.7      0.3  medium
9     3  c   0.3      0.4      0.0     low
13    3  d   0.7      0.8      0.4  medium

In [97]: result = result[['bin', 'id', 'perc', 'result']]

In [98]: result.sort('id')
Out[98]: 
    bin id  perc  result
0     1  a   0.1     low
5     2  b   0.9    high
9     3  c   0.3     low
13    3  d   0.7  medium
7     2  e   0.5  medium

关于python - 使用 Python Pandas 根据第二个 df 中定义的 bins 在一个 df 中对数据进行 bin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25652438/

相关文章:

python - 如何在spyder中逐行调试而不输入外部库

python - 如何获得 DataFrame 中列值的组合结果?

MySQL获取最新记录而不在连接中使用自动增量字段

python - Pandas ,规范化 json-per-line

python - 创建一个函数来循环现有数据框并将值添加到新列

python - 为什么 Python 的无穷大哈希有 π 的数字?

Python:为什么使用 FFT 方法去除频率似乎没有去除数据的周期性?

MySQL更新加入限制

mysql - 索引和嵌套连接

python - Pandas Dataframe 上的左字符串函数查找要停止的字符位置