Pandas:将操作应用于多索引中的重复列

2023-12-29

我有 MultiColumns:第二级重复包含Job Openings and Hires。我想为每个顶级列减去一个,但我所做的一切都会让我陷入索引错误或切片错误。我怎样才能计算它?

样本数据:

>>> df.head()
Out[25]: 
           Total nonfarm              Total private               
                   Hires Job openings         Hires Job openings   
date                                                               
2001-01-01          5777         5385          5419         4887   
2002-01-01          4849         3759          4539         3381   
2003-01-01          4971         3824          4645         3424   
2004-01-01          4827         3459          4552         3153   
2005-01-01          5207         3670          4876         3358  

预期输出:

Out[25]: 
           Total nonfarm   Total private              
              difference      difference   
date                                                               
2001-01-01          1234            5678          
2002-01-01          1234            5678          
2003-01-01          1234            5678         
2004-01-01          1234            5678      
2005-01-01          1234            5678    

其中数字显然不正确。

特别是在 apply() 中

为了有一个普遍适用的方式,我试图建立

def apply(group):
    result = group.loc[:, pd.IndexSlice[:, 'Job openings']].div(group.loc[:, pd.IndexSlice[:, 'Hires']].values)
    result.columns = pd.MultiIndex.from_product([[group.columns.get_level_values(0)[0]], ['Ratio']])
    return result.values
foo = df.groupby(axis=1, level=0).apply(apply)

它存在两个问题:

  • 我需要欺骗.values为了得到正确的划分
  • foo不是一个正确的数据框:

    住宿和餐饮服务 [[0.76]、[0.480349344978]、[0.501388888889]、[... 艺术、娱乐和休闲 [[0.558139534884]、[0.46017699115]、[0.2483221... 建设 [[0.35], [0.274881516588], [0.267260579065], [...

我首先尝试返回result, 代替result.values,但这只会导致一个充满了的数据框NaN

特别是使用列名

我不喜欢得票最高的答案是它需要.diff() or .div()- 黑客行为,使得代码难以阅读,并且当子级别有两列以上时难以实现。


Setup

import pandas as pd

df = pd.DataFrame(
    [
        [5777, 5385, 5419, 4887],
        [4849, 3759, 4539, 3381],
        [4971, 3824, 4645, 3424],
        [4827, 3459, 4552, 3153],
        [5207, 3670, 4876, 3358],
    ],
    index=pd.to_datetime(['2001-01-01',
                          '2002-01-01',
                          '2003-01-01',
                          '2004-01-01',
                          '2005-01-01']),
    columns=pd.MultiIndex.from_tuples(
        [('Total nonfarm', 'Hires'), ('Total nonfarm', 'Job Openings'),
         ('Total private', 'Hires'), ('Total private', 'Job Openings')]
    )
)

print df

           Total nonfarm              Total private             
                   Hires Job Openings         Hires Job Openings
2001-01-01          5777         5385          5419         4887
2002-01-01          4849         3759          4539         3381
2003-01-01          4971         3824          4645         3424
2004-01-01          4827         3459          4552         3153
2005-01-01          5207         3670          4876         3358

Try:

df.T.groupby(level=0).diff(-1).dropna().T

           Total nonfarm Total private
                   Hires         Hires
2001-01-01         392.0         532.0
2002-01-01        1090.0        1158.0
2003-01-01        1147.0        1221.0
2004-01-01        1368.0        1399.0
2005-01-01        1537.0        1518.0

要应用其他变换(例如比率),您可以执行以下操作:

print df.T.groupby(level=0).apply(lambda x: np.exp(np.log(x).diff(-1))).dropna().T

           Total nonfarm Total private
                   Hires         Hires
2001-01-01      1.072795      1.108860
2002-01-01      1.289971      1.342502
2003-01-01      1.299948      1.356600
2004-01-01      1.395490      1.443704
2005-01-01      1.418801      1.452055

Or:

print df.T.groupby(level=0).apply(lambda x: x.div(x.shift(-1))).dropna().T

           Total nonfarm Total private
                   Hires         Hires
2001-01-01      1.072795      1.108860
2002-01-01      1.289971      1.342502
2003-01-01      1.299948      1.356600
2004-01-01      1.395490      1.443704
2005-01-01      1.418801      1.452055

要重命名列并与原始数据框合并,您可以:

df2 = df.T.groupby(level=0).diff(-1).dropna().T
df2.columns = pd.MultiIndex.from_tuples(
    [('Total nonfarm', 'difference'),
     ('Total private', 'difference')])
pd.concat([df, df2], axis=1).sort_index(axis=1)

好像:

           Total nonfarm                         Total private               \
                   Hires Job Openings difference         Hires Job Openings   
2001-01-01          5777         5385      392.0          5419         4887   
2002-01-01          4849         3759     1090.0          4539         3381   
2003-01-01          4971         3824     1147.0          4645         3424   
2004-01-01          4827         3459     1368.0          4552         3153   
2005-01-01          5207         3670     1537.0          4876         3358   

           difference  
2001-01-01      532.0  
2002-01-01     1158.0  
2003-01-01     1221.0  
2004-01-01     1399.0  
2005-01-01     1518.0  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas:将操作应用于多索引中的重复列 的相关文章

随机推荐

  • 以编程方式使用尺寸类别

    我 希望 观看了所有相关的 WWDC2014 会议视频并阅读了文档 所以这个问题主要是为了证实我的怀疑 但请赐教 我想做的是使用自动布局为视图添加动画效果 这本身并不是问题 但这些动画的端点随着不同的方向而变化 我想我也许可以使用尺寸类来自
  • 无法配置 Firebase InstanceID

    您好 我正在尝试在我的应用程序中包含 firebase 并遵循文档 当我尝试进行 google 登录时 出现无法配置 Firebase InstanceID 错误 请建议如何克服此错误 有两件事需要检查 希望其中一项能为您解决 确保您的捆绑
  • 无法从 Xcode 运行 Instruments

    我最近升级到 Snow Leopard 从那以后我很难运行 Instrument 来从 Xcode 检测我的应用程序 录制 按钮将变灰 并且什么也不会发生 Xcode 的控制台中也没有消息告诉我出了什么问题 我曾经能够将其附加到进程或从仪器
  • 如何使用 jQuery 在 IE 中附加样式表?

    大家好 我只是想创建一个插件 我需要它对用户友好 所以我想append the 标签上的head加载我的插件时用户页面的一部分 它适用于所有其他浏览器 不确定 IE9 IE7 和 IE6 但不适用于 IE8 我不知道我的插件出了什么问题 所
  • 在 CakePHP 中重写 php 应用程序

    因此 我很想使用 php 框架重写我的应用程序 因为我认为这会让人们更容易参与 并改进应用程序的设计 CakePHP 看起来是最好的 PHP Web 框架 有人有这方面的经验吗 从手动编写 PHP 到使用框架 我应该考虑哪些注意事项 不取决
  • 写入 Mac OS X 10.7 中的“~/Library/Application Support”文件夹

    我可以使用 NSFileManager 在 Mac OS X 10 5 和 10 6 中的 Library Application Support 中创建 XYZ 文件夹 然而 在 10 7 中 它显示 您无权将 XYZ 保存在文件夹 应用
  • Enterprise Library 5.0 - 将自定义标记添加到 TextFormatter

    我创建了一个自定义异常 其中包含与我们的应用程序相关的数据 我想确保在引发异常时记录这些数据并将其记录到事件日志中 我尝试创建一个正在调用的自定义 TextFormatter 但不确定如何访问当前异常 以便我可以将自定义信息添加到日志条目中
  • Google Vision ocr:垂直和水平线文本识别

    我们正在使用 google Vision ocr 来收集收据中的文本 在某些情况下 收据上有一些垂直书写的文本 例如增值税信息等 问题是 谷歌视觉仅有效地读取主方向 例如水平方向 的文本 并丢弃在同一收据中以垂直方向而不是水平方向写入的所有
  • 向下滚动并双击最后一个展开/折叠箭头时,TreeTableView 项目消失

    在与一个TreeTableView我意识到 当您向下滚动表格并双击最后一个展开 折叠箭头时 所有项目都会消失 但是 当您再次滚动时 所有项目都会重新出现 当然 当你有足够的物品时就会发生这种情况 因此垂直ScrollBar活跃 以前有人遇到
  • 为什么结构类型的编译时生成技术会阻止单独编译?

    我正在读 好吧 略读 杜博切特和奥德斯基的在 JVM 上编译结构类型 http infoscience epfl ch record 138931 files 2009 structural pdf并对以下说法感到困惑 Generative
  • Scala 隐式转换陷阱

    EDIT好的 Drexin 提出了一个很好的观点 使用隐式转换器时类型安全性的损失 令人惊讶的结果 一个不太常见的转换怎么样 不会与 PreDef 隐式发生冲突 例如 我正在 Scala 中使用 JodaTime 很棒的项目 在定义隐式的同
  • 如果某些数据包含空格,如何读取逗号分隔的数据文件

    我正在尝试读取使用逗号作为分隔符的数据文件 如下所示 IPE 80 764 80 14 8 49 IPE 100 1030 171 15 92 但是如果我阅读使用 READ 1 var1 var2 var3 var4 它将 IPE 和 80
  • 如何为 ASP.NET Core Web API 应用程序的程序和启动 cs 文件编写单元测试

    有没有办法编写单元测试ProgramASP NET Core Web API 的 cs 文件以及类似的startup类 只是为了显示整个应用程序的更多代码覆盖率 目前显示覆盖率为 0 您可以在单独的调用中提取配置并将它们公开到 func 中
  • 当我使用requirements.txt时,pip没有从virtualenv中安装到site-packages目录

    我对使用 virtualenv 运行 Python 还比较陌生 所以这可能是一个简单的解决方案 但我一生都无法弄清楚发生了什么 我运行的是 Windows 7 professional x64 安装了 Python 2 7 5 我已经安装了
  • MatLab 分类数据中的缺失数据处理

    我正在尝试将我的数据集放入 MATLAB ranked weights relieff X Ylogical 10 categoricalx on 函数对我的预测特征的重要性进行排名 这dataset
  • 使用 Powershell 配置 IIS - 启用表单身份验证

    我的 IIS 看起来像这样 Sites gt Default Web Site gt MyWebApp 那么问题是 如何在 MyWebApp 上启用表单身份验证 我设法更改或编辑匿名访问 基本和 Windows 身份验证 然而 Forms
  • pandas:具有多索引的布尔索引

    这里有很多具有类似标题的问题 但我找不到解决这个问题的问题 我有来自许多不同来源的数据帧 我想逐个过滤 当布尔系列与过滤后的数据帧大小相同时 使用布尔索引效果很好 但当该系列的大小与更高级别的索引过滤后的数据帧 简而言之 假设我有这个数据框
  • 如何迭代查询结果

    我正在用 pgsql 脚本语言创建一个函数 此时我想做的是迭代查询的结果 并为每一行执行特定的操作 我当前的尝试如下 其中temprow被声明为temprow user data users rowtype 有问题的代码如下 FOR tem
  • 显示与 main.cpp 不同的类

    我是qt新手 我有一个有多种表格的申请 我试图从 main cpp 中选择特定的表单 但它只是闪烁了表单 但我正在获取表单的调试值 并且表单是不可见的 我的main cpp代码 include dialog h include design
  • Pandas:将操作应用于多索引中的重复列

    我有 MultiColumns 第二级重复包含Job Openings and Hires 我想为每个顶级列减去一个 但我所做的一切都会让我陷入索引错误或切片错误 我怎样才能计算它 样本数据 gt gt gt df head Out 25