Python 中按年月分组并删除所有 NaN 的列

2024-01-30

基于来自的输出数据帧这个链接: https://stackoverflow.com/questions/69937232/groupby-year-month-and-find-top-n-smallest-values-columns-in-python

import pandas as pd
import numpy as np

np.random.seed(2021)
dates = pd.date_range('20130226', periods=90)
df = pd.DataFrame(np.random.uniform(0, 10, size=(90, 6)), index=dates, columns=['A_values', 'B_values', 'C_values', 'D_values', 'E_values', 'target'])

models = df.columns[df.columns.str.endswith('_values')]

# function to calculate mape
def mape(y_true, y_pred):
    y_pred = np.array(y_pred)
    return np.mean(np.abs(y_true - y_pred) / np.clip(np.abs(y_true), 1, np.inf),
                   axis=0)*100

errors = (df.groupby(pd.Grouper(freq='M'))
            .apply(lambda x: mape(x[models], x[['target']]))
         )

k = 2
n = len(models)

sorted_args = np.argsort(errors, axis=1) < k

res = pd.merge_asof(df[['target']], sorted_args, 
                             left_index=True, 
                             right_index=True,
                             direction='forward'
                            )

topk = df[models].where(res[models])

df = df.join(topk.add_suffix('_mape'))

df = df[['target', 'A_values_mape', 'B_values_mape', 'C_values_mape', 'D_values_mape',
       'E_values_mape']]
df

Out:

              target  A_values_mape  ...  D_values_mape  E_values_mape
2013-02-26  1.281624       6.059783  ...       3.126731            NaN
2013-02-27  0.585713       1.789931  ...       7.843101            NaN
2013-02-28  9.638430       9.623960  ...       5.612724            NaN
2013-03-01  1.950960            NaN  ...            NaN       5.693051
2013-03-02  0.690563            NaN  ...            NaN       7.322250
             ...            ...  ...            ...            ...
2013-05-22  5.554824            NaN  ...            NaN       6.803052
2013-05-23  8.440801            NaN  ...            NaN       2.756443
2013-05-24  0.968086            NaN  ...            NaN       0.430184
2013-05-25  0.672555            NaN  ...            NaN       5.461017
2013-05-26  5.273122            NaN  ...            NaN       6.312104

我怎样才能按年月分组并删除所有列NaNs,然后将其余列重命名为 ie.,top_1, top_2, ..., top_k?

最终的预期结果可能是这样的如果k=2:

伪代码:

df2 = df.filter(regex='_mape$').groupby(pd.Grouper(freq='M')).dropna(axis=1, how='all')
df2.columns = ['top_1', 'top_2', ..., 'top_k']
df.join(df2)

正如 @Quang Hoang 在上一篇文章中评论的那样,我们可以使用justify_nd来实现这一点,但我不知道如何实现。感谢您提前的帮助。

EDIT:

dates = pd.date_range('20130226', periods=90)
df = pd.DataFrame(np.random.uniform(0, 10, size=(90, 6)), index=dates, columns=['A_values', 'B_values', 'C_values', 'D_values', 'E_values', 'target'])

models = df.columns[df.columns.str.endswith('_values')]

k = 2
n = len(models)

def grpProc(grp):
    err = mape(grp[models], grp[['target']])
    # sort_args = np.argsort(err) < k
    # cols = models[sort_args]
    cols = err.nsmallest(k).index
    out_cols = [f'top_{i+1}' for i in range(k)]
    rv = grp.loc[:, cols]
    rv.columns = out_cols
    return rv

wrk = df.groupby(pd.Grouper(freq='M')).apply(grpProc)

res = df[['target']].join(wrk)
print(res)

Out:

              target     top_1     top_2
2013-02-26  1.281624  6.059783  9.972433
2013-02-27  0.585713  1.789931  0.968944
2013-02-28  9.638430  9.623960  6.165247
2013-03-01  1.950960  4.521452  5.693051
2013-03-02  0.690563  5.178144  7.322250
             ...       ...       ...
2013-05-22  5.554824  3.864723  6.803052
2013-05-23  8.440801  5.140268  2.756443
2013-05-24  0.968086  5.890717  0.430184
2013-05-25  0.672555  1.610210  5.461017
2013-05-26  5.273122  6.893207  6.312104

实际上,您需要的是,对于每个组(按年/月):

  • compute errors locally对于当前组,
  • find k“想要”列(调用argsort)并采取指示 列来自models,
  • 从当前组中取出指定的列并将其重命名为top_…,
  • 返回您到目前为止生成的内容。

为此,定义一个“组处理”函数:

def grpProc(grp):
    err = mape(grp[models], grp[['target']])
    sort_args = np.argsort(err) < k
    cols = models[sort_args]
    out_cols = [f'top_{i+1}' for i in range(k)]
    rv = grp.loc[:, cols]
    rv.columns = out_cols
    return rv

然后,生成top_…单独列,将此函数应用于每个组:

wrk = df.groupby(pd.Grouper(freq='M')).apply(grpProc)

最终生成预期的连接结果target列与wrk:

result = df[['target']].join(wrk)

根据您的源数据,其前 15 行是:

              target     top_1     top_2
2013-02-26  1.281624  6.059783  3.126731
2013-02-27  0.585713  1.789931  7.843101
2013-02-28  9.638430  9.623960  5.612724
2013-03-01  1.950960  4.521452  5.693051
2013-03-02  0.690563  5.178144  7.322250
2013-03-03  6.177010  8.280144  6.174890
2013-03-04  1.263177  5.896541  4.422322
2013-03-05  5.888856  9.159396  8.906554
2013-03-06  2.013227  8.237912  3.075435
2013-03-07  8.482991  1.546148  6.476141
2013-03-08  7.986413  3.322442  4.738473
2013-03-09  5.944385  7.769769  0.631033
2013-03-10  7.543775  3.710198  6.787289
2013-03-11  5.816264  3.722964  6.795556
2013-03-12  3.054002  3.304891  8.258990

Edit

对于第一组(2013-02-28) err包含:

A_values     48.759348
B_values     77.023855
C_values    325.376455
D_values     74.422508
E_values     60.602101

请注意,2 个最低误差值是48.759348 and 60.602101, 所以从这个组中你可能应该采取A_values(还行吧) 和E_values(代替D_values).

所以也许grpProc函数而不是:

sort_args = np.argsort(err) < k
cols = models[sort_args]

应包含:

cols = err.nsmallest(k).index
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中按年月分组并删除所有 NaN 的列 的相关文章

  • ASCII - Asciimatics - 如何在代码中实现效果/屏幕

    几篇文章之前 有人建议我研究一下 Python 的 Asciimatics 库 我正在尝试使用以下方法来解决它 样品 https github com peterbrittain asciimatics tree master sample
  • H2O服务器崩溃

    去年我一直在使用 H2O 我已经厌倦了服务器崩溃 我已经放弃了 夜间发布 因为它们很容易被我的数据集崩溃 请告诉我在哪里可以下载稳定的版本 Charles 我的环境是 Windows 10 企业版 内部版本 1607 具有 64 GB 内存
  • 如何将字典和列表安全转储到 YAML 中?

    我想要输出为下面的 YAML item Food eat Food itemId 42536216 category fruit moreInfo organic 我已使用以下代码按照与上面相同的顺序进行打印 但输出未按预期进行 Code
  • 将多个 csv 文件连接成具有相同标头的单个 csv

    我目前正在使用以下代码导入 6 000 个 csv 文件 带标题 并将它们导出到单个 csv 文件 带单个标题行 import csv files from folder path r data US market merged data
  • 从 SQL 数据库导入表并按日期过滤行时,将 Pandas 列解析为日期时间

    我有一个DataFrame列名为date 我们如何将 日期 列转换 解析为DateTime object 我使用 Postgresql 数据库加载日期列sql read frame 的一个例子date列是2013 04 04 我想做的是选择
  • 在 pandas DataFrame 中使用比较列表的问题

    我在 pandas 中有一个 DataFrame 其列类型之一是 int 上的列表 如下所示 df pandas DataFrame 1 2 3 4 5 6 7 8 9 10 columns a b c d gt gt gt df a b
  • 如何从文件中读取两行并在 for 循环中创建动态键,后续

    这个问题紧接着所讨论的问题 如何从文件中读取两行并在 for 循环中创建动态键 https stackoverflow com q 41929351 868546 但是 问题的本质已经发展到我想要解决的某种复杂性 下面是我的数据结构 用空格
  • 检查是否存在多列

    是否有更复杂的方法来检查数据框df包含 2 个名为Column 1 and Column 2 if numpy all map lambda c c in df columns Column 1 Columns 2 do something
  • 按列表中(不在)中的索引值对 Pandas 数据帧进行切片

    我有一个pandas数据框 df 我想选择所有索引df那是not在列表中 blacklist 现在 我使用列表理解来创建所需的切片标签 ix i for i in df index if i not in blacklist df sele
  • GitPython 检查 git pull 是否更改了本地文件

    使用 GitPython 我只想在拉取后本地文件发生更改时才调用函数 例如 如果我在一台单独的计算机上进行推送 然后拉第一台计算机 它按预期工作 但不提供任何输出 理想的输出是已更改的文件列表 或者只是告诉我拉动是否有错误 没有拉动 因为分
  • 从嵌套列表创建数组时抑制 Numpy 中的科学记数法

    我有一个嵌套的 Python 列表 如下所示 my list 3 74 5162 13683628846 64 12783387559 86 1 81 9 55 116 189688622 37 260332262 0 1 97 2 2 7
  • Pandas.read_excel 有时会错误地将布尔值读取为 1/0

    我需要将一个非常大的 Excel 文件读入 DataFrame 中 该文件包含字符串 整数 浮点和布尔数据 以及丢失的数据和完全空的行 还值得注意的是 某些单元格值源自单元格公式和 或 VBA 尽管理论上这不会影响任何内容 正如标题所示 p
  • 熊猫按 n 最大总和分组

    我正在尝试使用groupby nlargest and sum在 Pandas 中一起运行 但在运行时遇到困难 State County Population Alabama a 100 Alabama b 50 Alabama c 40
  • Spacy 实体规则不适用于基数(社会安全号码)

    我已使用实体规则为社会保障号添加新标签 即使设置了 overwrite ents true 但它仍然无法识别 我验证了正则表达式是正确的 不知道我还需要做什么 我之前尝试过 ner 但结果相同 text My name is yuyyvb
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • multiprocessing.Queue 中的 ctx 参数

    我正在尝试使用 multiprocessing Queue 模块中的队列 实施 https docs python org 3 4 library multiprocessing html exchang objects Between p
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都

随机推荐

  • WPF 按钮中的文本内容未垂直居中

    WPF 按钮的文本内容在文本上方出现不需要的空格是否有原因 我在 StackPanel 中有一个按钮 这个按钮是一个简单的关闭按钮 所以我希望它显示为一个方形按钮 中间有一个 x 我已将填充设置为零 并将 Horizo ntalConten
  • 如何安装旧版本的 postgresql 和 postgis?

    我是 Linux 新手 我发现安装旧版本的 postgresql 以及 postgis 真的很困难 我已经卸载了在 aptidude 中可以找到的连接到 postgresql 的所有内容 由于只能通过 apt get install 获得最
  • 像 .map() 这样的高阶函数在 JavaScript 内部是如何工作的?

    现在每个人都尝试使用这些高阶函数 https en wikipedia org wiki Higher order function通过编写更少的代码获得有希望的结果 但我想知道这些函数内部是如何工作的 假设我写了类似的东西 var num
  • LibGDX 网格高度图法线和灯光

    我正在尝试让网格法线和灯光在 LibGDX 项目中工作 我已经有了从高度图纹理像素生成的纹理网格 问题是我无法正确点亮法线 另外 我不能 100 确定我在 TerrainChunk 类中正确设置了法线顶点 这是主类代码 package co
  • staggerChildren 与成帧器运动

    我在使成帧器运动 staggerChildren 过渡到处理简单的项目列表时遇到一些问题 它基本上允许子组件的动画交错 我为父容器和子容器设置了这样的动画属性 const container hidden opacity 0 show op
  • ArrayCollection:以表单形式检索集合

    我使用 Symfony2 制作了一个 Web 应用程序 其中用户与实体 Mission 具有数组关联 ManytoMany 用户可以通过表单上传实体 product 表单传递的数据之一是与用户关联的任务 每个用户都有不止一个任务 因此 当他
  • 页脚在底部有CSS网格吗?想不通吗?

    我看过其他教程 了解如何在内容很少时使用 css 网格使页脚粘在底部 但我无法弄清楚 如果你能帮忙 那就太好了 我正在学习 css grid 我花了几天时间断断续续地试图弄清楚它 margin 0 padding 0 color fffff
  • 错误:“文件‘/MasterPages/MainMaster.master’不存在。” (是的,这个文件确实存在!)

    我刚买了一台新的台式电脑 操作系统为 Windows 7 Pro 我在这台新计算机上安装了 Visual Studio 2008 并尝试打开以前存在的 ASP NET 3 5 解决方案 该解决方案在我以前的计算机上显示得非常好 以前的计算机
  • Chrome.system.cpu API 使用情况

    是否可以使用 chrome system cpu api 获取当前 CPU 负载 我特别不知道如何将返回的数字转换为总电流负载的百分比 我发现了这一点 但不太确定如何实现 调用者可以通过进行两次调用 减去时间并除以总时间差来计算负载分数 h
  • 减小折叠菜单的宽度

    在下面的代码中 当单击折叠菜单时 会提供一个与页面全宽的下拉菜单 div class row div class col sm 8 div class navbar header div div div
  • Angular 2 双向数据绑定不起作用

    我在 Angular 2 中获取自定义双向数据绑定时遇到问题 文档表明盒子模型中的香蕉 只是语法糖 但是在我的示例中 这种方式不起作用 而且时间更长方法的工作原理
  • ggplot 中轴/变量标签的键值映射

    我经常使用具有 R 友好 程序员友好 列名称的数据框 通常没有空格和 或缩写 在进行分析时懒于输入全名 例如 ir lt data frame sp iris Species sep len iris Sepal Length sep wi
  • Long 不能取消引用

    我几乎做了一切来解决 长不能取消引用 这个恼人的问题 但一切都解决了 因此 有人可以帮助我吗 问题是当我检查程序是否超时时if System currentTimeMillis longValue finish 比较不起作用 public
  • Sql ServerPreparedStatement为SQL“in(?)”子句设置参数

    我有一个sql看起来像这样 SELECT FROM T TABLE WHERE ID IN 我想设置参数IN via PrepareStatement 我认为所需的方法如下所示 prepareStatement setList 1 Arra
  • 为什么不是 scanf("%*[^\n]\n");和 scanf("%*[^\n]%*c");清除悬挂的换行符?

    拨打电话后scanf d variable 我们留下了一个换行符挂在stdin 应在调用之前清除fgets 或者我们最终给它提供一个换行符并使其过早返回 我找到了建议使用的答案scanf n c 第一次致电后scanf放弃换行符和其他建议使
  • oracle查询比较表中具有相同id的所有行

    需要一个 sql 查询来生成具有相同 id 的状态为完整的记录 例如 mytable是包含各种记录的表名 我们需要找到同一 ID 的所有状态为完整的 ID id status 12 complete 12 required 12 activ
  • Google 网站管理员工具 API:通过 OAUTH2 下载查询

    我正在尝试使用 Google 的网站管理员工具 API 下载最近搜索查询的 CSV 文件 我知道如何使用他们的 Python 示例来做到这一点http googlewebmastercentral blogspot com 2011 12
  • 如何向 .DecimalPad iOS 键盘添加减号?

    如何向 DecimalPad 类型 iOS 键盘添加减号 就像下面链接中的应用程序一样 如果我错了 请纠正我 但这对我来说似乎不是一个自定义键盘 它看起来像是苹果公司的默认十进制键盘 带减号的十进制键盘 https i stack imgu
  • Apache 基准 HTTPS 失败

    我在 Ubuntu 虚拟机中使用 Apache 2 4 2 我用它来加载测试 将请求发送到某个 HTTPS url 失败的请求数为零 但我的请求都无法真正得到处理 已经在数据库中查找 使用相同的url 通过浏览器调用它就可以了 数据库已更新
  • Python 中按年月分组并删除所有 NaN 的列

    基于来自的输出数据帧这个链接 https stackoverflow com questions 69937232 groupby year month and find top n smallest values columns in p