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

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(使用前将#替换为@)

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

随机推荐

  • 如何消除真正非递归函数在 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