组合两个具有重叠范围的数据框并计算按类别分组的重叠

2023-12-30

建立在这个答案 https://stackoverflow.com/questions/58570888/combine-two-dataframes-based-on-ranges-which-may-partially-overlap-using-pandas/58572420#58572420
我有两个大数据框(100K 行),df Assay 有值,df Strat 有“类型”。我想根据深度将 Strat 中的“类型”分配给 Assay 中的列。深度以深度“From”和深度“To”列给出。 “类型”也由深度“From”和“To”定义。但它们的间隔不同。测定深度可以跨越多种 Strat 类型。

我想将 Strat“类型”分配给 Assay df,如果有多种类型,也尝试捕获该信息。

我想循环数据以填充每个 HOLE_ID 的类型列。

生成示例数据:

import pandas as pd
import numpy as np
Assay=pd.DataFrame(np.array([['Hole_1',1.0,2.5,0.001],['Hole_1',2.5,5.0,0.005],['Hole_1',5.0,7.0,0.002],['Hole_1',7.0,10.0,0.001],['Hole_2',1.0,3.0,0.001],['Hole_2',3.0,5.0,0.005],['Hole_2',5.0,7.0,0.002],['Hole_2',7.0,10.0,0.001]]),columns=['HOLE_ID','FROM', 'TO', 'val'])

Strat=pd.DataFrame(np.array([['Hole_1',0.0,4.0,'A'],['Hole_1',4.0,5.0,'B'],['Hole_1',5.0,6.5,'C'],['Hole_1',6.5,8.0,'D'],['Hole_1',8.0,10.0,'E'],['Hole_2',0.0,4.0,'A'],['Hole_2',4.0,5.1,'B'],['Hole_2',5.1,6.0,'C'],['Hole_2',6.0,8.0,'D'],['Hole_2',8.0,10.0,'E']]),columns=['HOLE_ID','FROM', 'TO', 'Type'])

Assay

Out[1]: 
  HOLE_ID FROM    TO    val
0  Hole_1  1.0   2.5  0.001
1  Hole_1  2.5   5.0  0.005
2  Hole_1  5.0   7.0  0.002
3  Hole_1  7.0  10.0  0.001
4  Hole_2  1.0   3.0  0.001
5  Hole_2  3.0   5.0  0.005
6  Hole_2  5.0   7.0  0.002
7  Hole_2  7.0  10.0  0.001

Strat

Out[2]: 
  HOLE_ID FROM    TO Type
0  Hole_1  0.0   4.0    A
1  Hole_1  4.0   5.0    B
2  Hole_1  5.0   6.5    C
3  Hole_1  6.5   8.0    D
4  Hole_1  8.0  10.0    E
5  Hole_2  0.0   4.0    A
6  Hole_2  4.0   5.1    B
7  Hole_2  5.1   6.0    C
8  Hole_2  6.0   8.0    D
9  Hole_2  8.0  10.0    E

所需输出的示例:

  HOLE_ID FROM    TO    val                Type
0  Hole_1  1.0   2.5  0.001              A 100%
1  Hole_1  2.5     5  0.005         A 60%,B 44%
2  Hole_1  5.0   7.0  0.002        C 80%, D 20%
3  Hole_1  7.0  10.0  0.001        D 30%, E 70%
4  Hole_2  1.0   3.0  0.001              A 100%
5  Hole_2  3.0   5.0  0.005         A 50%, B50%
6  Hole_2  5.0   7.0  0.002  B 5%, C 45%, D 50%
7  Hole_2  7.0  10.0  0.001         D 30% E 70%

我的尝试如下,但不起作用。我不太擅长循环,并且进行了一些有希望的尝试,但代码似乎会永远运行(注意,我的实际数据集约为 100k 行和 1500 个 HOLE_ID,因此对我的系统的要求可能相当高)​​。

我添加了 np.arange ,以便我可以使用浮点数(0.1 m 增量来生成辅助序列),并且我认为我已经计算了百分比,但我有点超出了我的深度。

进行一些预处理,以确保仅使用匹配的孔 ID(实际数据很大,并且还包含示例数据集中未包含的其他列。)

assay_Hole_IDs =Assay['HOLE_ID'].unique().tolist()
strat_Hole_IDS =Strat['HOLE_ID'].unique().tolist()

Strat=Strat[Strat['HOLE_ID'].isin(assay_Hole_IDs)]
Assay=Assay[Assay['HOLE_ID'].isin(assay_Hole_IDs)]


assay_Hole_IDs =Assay['HOLE_ID'].unique().tolist()
strat_Hole_IDS =Strat['HOLE_ID'].unique().tolist()

检查是否没有附加值


j=set(assay_Hole_IDs).symmetric_difference(set(strat_Hole_IDS))
print len(j)
j

then:

all_holes= Strat['HOLE_ID'].unique().tolist()

def getType(row):
for hole in all_holes:
    df=Strat.loc[Strat['HOLE_ID']==hole]

    units = df.set_index('Type').apply(lambda row: pd.Series(
    np.arange(row.FROM, row.TO,0.1)), axis=1).stack()\
    .reset_index(level=1, drop=True)

    gr = units[units.ge(row.FROM) & units.lt(row.TO)].groupby(level=0)
    if gr.ngroups == 1:
        return gr.ngroup().index[0]

    txt = []
    counts = []
    pct=[]
    for key, grp in gr:
        siz = grp.size
        un = 'unit' if siz == 1 else 'units'

        counts.append(float(siz))
    for x in counts:
        p=(float(x)/float(sum(counts))*100)
        pct.append(float(p))
    return pct

then:

assay['Type'] = assay.groupby('HOLE_ID').apply(getType)

谁能明白为什么这不起作用?


def group(df1):
    df2 = Strat[Strat['HOLE_ID']==df1.iloc[0]['HOLE_ID']]
    df1[['FROM','TO']] = df1[['FROM','TO']].astype(float)
    df2[['FROM','TO']] = df2[['FROM','TO']].astype(float)

    temp =  pd.concat([df1[['FROM','TO']],df2[['FROM','TO']]]).unstack().reset_index(drop=True) \
              .drop_duplicates().sort_values().reset_index(drop=True) \
              .to_frame(name='FROM').merge(df2, how='outer').ffill()
   temp['TO'] = temp.shift(-1)['FROM']


    def tobins(x):
        agg = temp[(x.FROM <= temp.FROM) & (temp.FROM < x.TO)].groupby('Type') \
                .apply(lambda y: y['TO'].max() - y['FROM'].min()).reset_index(name='res')
        agg.res = agg.Type + ' ' + (agg.res/agg.res.sum()).map('{:.0%}'.format)
        return '; '.join(agg.res.tolist())

    df1['Type'] = df1.apply(tobins,axis=1)
    return df1

Assay.groupby('HOLE_ID').apply(group)

  HOLE_ID  FROM    TO    val          Type
0  Hole_1   1.0   2.5  0.001        A 100%
1  Hole_1   2.5   5.0  0.005  A 60%; B 40%
2  Hole_1   5.0   7.0  0.002  C 75%; D 25%
3  Hole_1   7.0  10.0  0.001  D 33%; E 67%
4  Hole_2   1.0   3.0  0.001        A 100%
5  Hole_2   3.0   5.0  0.005        B 100%
6  Hole_2   5.0   7.0  0.002  C 75%; D 25%
7  Hole_2   7.0  10.0  0.001  D 33%; E 67%

关键点是使用两个表中的所有点 FROM 和 TO 构建临时 DataFrame。为了HOLE_ID = 'Hole_1'它看起来如下。现在我们可以为 Assay (x) 的每一行获取临时表的那些行(x.FROM <= temp.FROM < x.TO),按类型对它们进行分组,计算份额并连接到结果格式

   FROM HOLE_ID    TO Type
0   0.0  Hole_1   1.0    A
1   1.0  Hole_1   2.5    A
2   2.5  Hole_1   4.0    A
3   4.0  Hole_1   5.0    B
4   5.0  Hole_1   6.5    C
5   6.5  Hole_1   7.0    D
6   7.0  Hole_1   8.0    D
7   8.0  Hole_1  10.0    E
8  10.0  Hole_1   NaN    E
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组合两个具有重叠范围的数据框并计算按类别分组的重叠 的相关文章

  • 计算温度的偏导数(温度的水平平流)

    我想知道哪种方法计算x和y方向温度的偏导数 温度的水平平流 最正确 第二个代码使用温度 纬向风和经向风的数据矩阵 提取温度 T 纬向风分量 u 和经向风分量 v 的数据 import matplotlib pyplot as plt imp
  • Python 按文件夹模块导入

    我有一个目录结构 example py templates init py a py b py a py and b py只有一个类 名称与文件相同 因为它们是猎豹模板 纯粹出于风格原因 我希望能够在中导入和使用这些类example py像
  • 在 python + Flask + Gunicorn + nginx + Compute Engine 应用程序中从 Google Cloud Storage 读取文件失败

    在 python Flask Gunicorn nginx Compute Engine 应用程序中读取从 Google Cloud Storage 下载的文件失败 代码链接 https github com samuq CE test h
  • 如何在 pygame 中聚焦光线或如何仅绘制窗口的某些圆形部分?

    对于这一点 如果您熟悉它 请想想 超级马里奥制造2 中嘘关卡中的黑暗模式 我试图在角色周围创建一个圆形聚光灯 这也将使圆圈范围内的任何内容都可见 例如部分站在地板上 敌人或场景中的任何其他物体 我的计划是首先绘制圆圈 聚光灯 然后绘制场景
  • Pygame 玩家精灵没有出现

    我一直在为学校计算机课做这个项目 但无法让玩家精灵出现 有人可以帮忙吗 当我运行主游戏循环时 除了玩家精灵之外 所有内容都正确显示 它应该由于箭头输入而在屏幕上移动并受到重力的影响 当我删除图像并仅使用对象类和矩形时 该代码也有效 impo
  • 肥皂服务的良好框架是什么?

    我正在寻找一个用于肥皂的好框架service 我更喜欢使用Pythonic框架 但是在查看了soaplib rpclib 太不稳定 SOAPy 不适用于2 7 和ZSI 太 令人困惑 之后 我不确定这是否可能 我对使用另一种语言感到满意 尽
  • ValueError:在 R 中使用 keras 模型时在用户代码中

    我正在尝试使用 R 在 R 中运行一维 CNNkeras包裹 我正在使用以下代码 library MASS library keras Create some data data Boston data lt Boston create a
  • 将 csv 文件按多列拆分为 panda 数据框

    我有一个包含多列的 tsv 文件 有 10 多列 但对我来说重要的列是名称为 user name shift id url id 的列 我想创建一个数据框 首先根据用户名分隔整个 csv 文件 即只有具有相同用户名的行才会分组在一起 从该块
  • Cython:为什么 size_t 比 int 快?

    更改某些 Cython 变量的类型int输入size t可以显着减少某些功能的时间 30 但我不明白为什么 例如 cimport numpy as cnp import numpy as np def sum int cnp int64 t
  • 在 (i)python 脚本中从 jupyter 内核获取输出

    我想从单个 ipython 会话中打开多个内核 在这些内核上运行代码 然后收集结果 但我不知道如何收集结果 甚至不知道如何查看 stdout stderr 我怎样才能做这些事情呢 到目前为止我所得到的 我已经使用如下代码管理了前两个步骤 打
  • 为图例中的点设置固定大小

    我正在制作一些散点图 我想将图例中的点的大小设置为固定的相等值 现在我有这个 import matplotlib pyplot as plt import numpy as np def rand data return np random
  • Python3.1中的视图?

    Python3 1中的视图到底是什么 它们的行为方式似乎与迭代器类似 并且它们也可以具体化为列表 迭代器和视图有何不同 据我所知 视图仍然附加到创建它的对象上 对原始对象的修改会影响视图 来自docs http docs python or
  • 如何将时间间隔划分为不同长度的部分?

    我有一个从 0 到t 我想把这个区间分成一个以2 25 2 25 1 5为周期的累积序列 方法如下 input start 0 stop 19 output sequence 0 2 25 4 5 6 8 25 10 5 12 14 25
  • 多线程写入文件

    前几天刚开始使用 python 对多线程的整个概念还很陌生 我在多线程时写入文件时遇到问题 如果我按照常规方式执行此操作 它会不断覆盖正在写入的内容 使用 5 个线程写入文件的正确方法是什么 不降低性能的最佳方法是在所有线程之间使用队列 每
  • 如何替换被测模块的文件访问引用

    pyfakefs https code google com p pyfakefs 听起来非常有用 它 最初是作为核心 Python 模块的一个适度的假实现来开发的 以支持中等复杂的文件系统交互 并于 2006 年 9 月在 Google
  • import numpy 和 import numpy as np 之间的区别

    我明白 如果可能的话 应该使用 import numpy as np 这有助于避免由于命名空间引起的任何冲突 但我注意到虽然下面的命令有效 import numpy f2py as myf2py 以下不 import numpy as np
  • Beautiful Soup 获取动态表数据

    我有以下代码 url https www basketball reference com leagues NBA 2017 standings html all expanded standings html urlopen url so
  • Python 类方法的示例用例是什么?

    我读了Python 中的类方法有什么用 https stackoverflow com questions 38238 what are class methods in python for但那篇文章中的例子很复杂 我正在寻找 Pytho
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip
  • 将 pandas 数据框中的多列更改为日期时间

    我有一个 13 列和 55 000 行的数据框 我正在尝试将其中 5 行转换为日期时间 现在它们返回类型 对象 我需要转换这些数据以进行机器学习 我知道如果我这样做 data birth date pd to datetime data b

随机推荐

  • 如何消除真正非递归函数在 JIT_TailCall 中花费的时间

    我正在编写一个 64 位 F 解决方案 分析显示出令人惊讶且意想不到的大量时间花费在JIT TailCall 它实际上在运行时占据主导地位 大约 80 它与它的邪恶表弟一起出现JIT TailCallHelperStub ReturnAdd
  • 如何设置RadioGroup中只有一个RadioButton可以同时选中

    我在radiogroup中创建了一个单选按钮 但是当我尝试运行应用程序时 所有单选按钮都可以一直被选择 如何设置一次只能选择一个单选按钮 我在用着Fragment RadioGroup radioGroup RadioGroup rootV
  • 跳转到 Intellij IDEA 中的编辑器快捷方式

    I can use F12 to jump to project tree if it was the last tool that I used but is there a shortcut for jumping back to ed
  • 将CAB文件添加到操作系统设计中

    我需要将 CAB 文件 我的安装 添加到操作系统设计中 但我找不到方法来做到这一点 我需要它来在操作系统第一次加载时自动安装程序 我说的是win Compact 7 你能帮助我吗 我有点困惑 为什么要将 CAB 添加到操作系统设计中并在运行
  • 如何在 Java 中比较两个版本字符串?

    是否有比较版本号的标准习惯用法 我不能只使用直接的 String CompareTo 因为我还不知道最大的点释放数量是多少 我需要比较版本并确保以下内容成立 1 0 lt 1 1 1 0 1 lt 1 1 1 9 lt 1 10 这篇旧文章
  • 在 Ruby on Rails (MySQL) 中使用“end”作为列名称

    我有一个带有 结束 列 日期时间格式 的模型 却发现每当我尝试在查询中引用该列时 Heroku 都会崩溃并因不合逻辑的 Active Record 错误而烧毁 我花了两个小时尝试调试这个极其简单的查询 之后我将该列重命名为 end at 所
  • Git 存储库从一台机器到另一台机器

    所以我有一个 git 存储库 我曾在某个时刻提取过该存储库 并且该存储库驻留在服务器上 我无权访问我从中提取它的原始存储库 如何将代码从现有服务器获取到另一台计算机 编辑1 所以它看起来像这样 计算机 A 我最初从中签出的 git 存储库
  • pandas 0.21.0 时间戳与 matplotlib 的兼容性问题

    我刚刚将 pandas 从 0 17 1 更新到 0 21 0 以利用一些新功能 并遇到了与 matplotlib 的兼容性问题 我也将其更新到最新的 2 1 0 特别是 Timestamp 对象似乎发生了重大变化 我碰巧有另一台机器仍在运
  • Python 编译器是否可以优化一些整数运算?

    灵感来自this https stackoverflow com questions 11476190 why 0 6 is 6 false关于Python缓存小整数的问题 Python编译器是否可以在编译时将 0 6 替换为 6 下面的代
  • android TabLayout 从服务器设置图标

    我可以从服务器上设置图标吗TabLayout using Picasso library private string path 192 168 0 102 project a png TabLayout tabLayout TabLayo
  • 在 Heroku 上使用 React、Axios 访问内部 API

    我正在构建一个全栈 React 应用程序 该应用程序使用 Axios 访问其自己的后端 API 在我的本地环境中 以下内容按预期工作 服务器使用 JSON 数据进行响应 然后正确呈现该数据 axios get api questions c
  • Grunt Livereload + Grunt Connect 代理

    我在我的 API 中使用 Rails 在前面使用 AngularJS 并且在使 livereload grunt connect 代理正常工作时遇到一些问题 这是我的 gruntfile 中的片段 connect options port
  • MYSQL 查询锁定服务器

    当尝试执行此查询时 我的 mysql 服务器 cpu 使用率达到 100 并且页面停止运行 我在 Client Code Date Time Time Stamp Activity Code Employee Name ID Transac
  • 为什么我看到“排序规则‘xxx’对于字符集‘yyy’无效”

    我使用的是 Amazon RDS 上的 MySQL 5 6 22 InnoDB 我尝试将所有表 列 连接和数据库字符集和排序规则设置设置为 utf8mb4 utf8mb4 unicode ci 我在任何地方都找不到任何证据表明任何东西都有字
  • Java获取html文件

    复制 如何用 Java 以编程方式下载网页 https stackoverflow com questions 238547 how do you programmatically download a webpage in java 如何
  • 如何将 IPython 笔记本转换为 PDF 和 HTML?

    我想转换我的 ipython 笔记本来打印它们 或者只是以 html 格式发送它们 我注意到已经有一个工具可以做到这一点 NB转换 https github com ipython nbconvert 虽然我已经下载了它 但我不知道如何使用
  • 在 Firebase 托管上提供 gzip 压缩文件

    我对使用 Firebase 托管提供 gzipped html css js 文件感兴趣 我尝试在 firebase json 中设置 Content Encoding 标头 但在部署时出错 据称 您可以设置的唯一标头包括 Cache Co
  • 为什么我要 std::move std::shared_ptr?

    我一直在寻找铿锵源码 https clang llvm org doxygen CompilerInstance 8cpp source html l00069我发现了这个片段 void CompilerInstance setInvoca
  • 将汇编 NASM 代码链接到 GCC

    我在编译汇编代码 nasm 时遇到问题 在 Linux elf32 上 使用 g 编译后它不会失败 但是当我尝试使用 i686 w64 mingw32 g 对于 Win32 构建它时 它失败了 我的 build sh 脚本 bin bash
  • 组合两个具有重叠范围的数据框并计算按类别分组的重叠

    建立在这个答案 https stackoverflow com questions 58570888 combine two dataframes based on ranges which may partially overlap us