在多索引数据框中选择行

2024-02-11

我想单独提取“S”的 bin,其中每列 (X&Y) > 0.5,或多个 bin > 0.5 *“行数”。

在示例中;

对于“AR1”,应仅选择 bin 4,因为“X”和“Y”> 0.5(蓝色指示)

对于“PO1”,应选择 bin 1、2、3 和 4,因为“X”和“Y”> (4 * 0.5)(黄色指示)。

我之前已经尝试过这个for loop,但这没有正确工作;有条件地选择多个(相邻)行 https://stackoverflow.com/questions/41590518/selecting-multiple-neighboring-rows-conditionally

np.random.seed(0)

N = 20
S = ['AR1', 'PO1']

df = pd.DataFrame(
    {'X':np.random.uniform(-1,1,N),
     'Y':np.random.uniform(-1,1,N),
     'S':np.random.choice(S,N),
    })

df['bins_X'] = df.groupby('S')['X'].apply(pd.qcut, q=5, labels=np.arange(5))    # create bins per column 'S'

def func(df):                                                                   # create function to group per 'S' and their bins
    df1 = df.groupby(['S','bins_X']).sum()
    new_cols= list(zip(df1.columns.get_level_values(0)))
    df1.columns = pd.MultiIndex.from_tuples(new_cols)
    return df1

print func(df)

EDIT

它应该看起来像问题中所示的 df ,但不符合条件的行被过滤掉。我检查的是这个;对于任何行(bin),单独或组合的 X 和 Y > 0.5 中的值。仅连续组合行,组合 2、3、4 或 5 行。

即,0 的行组合为 ; 0+1、0+1+2、0+1+2+3 和 0+1+2+3+4。对于 1 ; 1+2、1+2+3 和 1+2+3+4 等。

多行的总和等于行数 x 0.5,例如,对于第 0 行到第 4 行,X 和 Y 必须 > 2.5。

编辑2: @JohnE 和 piRSquared,您的两个解决方案都有效,但是当数据框中存在不应评估的其他列时,哪一个会工作得更好?

另外,如果我想在你们的解决方案中添加一个附加条件怎么办?

编辑3: @piRSquared,当对某些列进行子集化时,我只得到返回的那些列,而我需要所有这些列,而不仅仅是子集化的列。

你能帮忙吗?谢谢。


这是一种矢量化方法,顶层只有一个循环(groupby.apply)

# columns that I care about
cols = ['X', 'Y']
df1.groupby(level=0)[cols].apply(find_window)

def find_window(df):
    v = df.values
    s = np.vstack([np.zeros((1, v.shape[1])), v.cumsum(0)])

    threshold = .5

    r, c = np.triu_indices(s.shape[0], 1)
    d = (c - r)[:, None]
    e = s[c] - s[r]
    mask = (e / d > threshold).all(1)
    rng = np.arange(mask.shape[0])

    if mask.any():
        idx = rng[mask][d[mask].argmax()]

        i0, i1 = r[idx], c[idx]
        return pd.DataFrame(
            v[i0:i1],
            df.loc[df.name].index[i0:i1],
            df.columns
        )

解释

strategy

  • numpy.triu_indices https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.triu_indices.html:我需要评估滚动的每个可能的窗口mean大于一些threshold。我将从位置 0 到 0 开始,然后从 0 到 1,然后...然后 1 到 1,1 到 2...等等,来捕获每个可能的窗口。但在完成之前我必须始终从一个位置开始。我可以通过以下方式访问这些组合numpy.triu_indices https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.triu_indices.html.
  • cumsum https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.cumsum.html:获取由我从中获得的每个索引组合指定的扩展数组会有点棘手(可行)np.triu_indices。更好的方法是计算cumsum并取一个索引与下一个索引的差值。
  • 我必须在我的前面加上零cumsum这样我就可以得到第一行的差异。
  • 但总数并不是手段。我需要除以行数才能得到平均值。方便地,结束位置和开始位置之间的差异恰好是行数,因此也是将总和除以计算平均值的适当数字。
  • 现在我有了办法,e / d,我检查哪些是> threshold并确定起始位置和结束位置的哪些组合的均值大于两列的阈值。
  • 然后,我在均值大于阈值的组合中确定行数最多的组合。
  • 我展开头寸并重建数据框
  • groupby and apply... QED

时间测试


有更多数据

np.random.seed(0)

N = 300
S = ['AR1', 'PO1', 'AR2', 'PO2', 'AR3', 'PO3']

df = pd.DataFrame(
    {'X':np.random.uniform(-1,1,N),
     'Y':np.random.uniform(-1,1,N),
     'S':np.random.choice(S,N),
    })

df['bins_X'] = df.groupby('S')['X'].apply(pd.qcut, q=20, labels=np.arange(20))    # create bins per column 'S'

def func(df):                                                                   # create function to group per 'S' and their bins
    df1 = df.groupby(['S','bins_X']).sum()
    new_cols= list(zip(df1.columns.get_level_values(0)))
    df1.columns = pd.MultiIndex.from_tuples(new_cols)
    return df1

df1 = func(df)

时差更是戏剧性

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

在多索引数据框中选择行 的相关文章

随机推荐

  • Azure 上的 Web Api 使用“return InternalServerError(ex)”不显示错误详细信息

    我的 Web Api 在本地运行时 在发布模式下 将返回以下格式的任何错误 Message An error has occurred ExceptionMessage No text specified ExceptionType Sys
  • 如何在 PrimeFaces 中的 CommandButton 上定义带有闭包的 oncomplete 事件?

    我正在使用一些 JavaScript 交互性扩展 PrimeFaces 应用程序的一部分 一切都始于CommandButton它从 bean 获取一些数据并调用 JavaScript 目前 它看起来像这样
  • 如何显示xml文件中的视频?

    您好 我使用下面给出的 xml 文件 如何从 xml 文件获取视频
  • 使用CMD在Mysql中导入压缩文件

    我正在尝试使用命令提示符将压缩数据库文件导入 Mysql 使用以下命令 7z lt backup sql 7z mysql u root test The root user don t有什么password与之相关 test是我的目标空白
  • WinForm应用程序数据持久化(C#)

    我相信 ASP NET 应用程序中 可变短期 持久性的最佳方法是 会话变量 会话范围 应用变量 应用范围 页面视图 页面范围 应用设置 应用范围 Windows 窗体应用程序中 可变短期 持久性的最佳方法是什么 表格范围 用户会话范围 应用
  • 如何将数据转换为非等列?

    我有一个事件数据集 按以下分组let像这样 set seed 3 events lt data frame let rep LETTERS 1 2 each 3 age c 0 sample 1 20 size 2 0 sample 1 2
  • 使用 boost 的 async_write 的异步 tcp 服务器会导致错误的文件描述符

    首先 我不是以英语为母语的人 所以我可能会犯一些语法错误 对此感到抱歉 我正在尝试使用 C 和 Boost 创建一个异步 TCP 服务器 我已经成功接受客户并收到他们的消息 但我无法回复他们的消息 我想要实现的是在 TCPServer 类上
  • 从 Xamarin / C# 中的 URL 加载 UIImage

    已经过去4年了这个问题 https stackoverflow com questions 2095635 load an image from a url已得到答复这篇博文 http escoz com blog displaying w
  • 使用 PHP 从 Microsoft Teams 自定义机器人验证 HMAC

    我正在尝试使用 PHP 验证 Microsoft Teams 自定义机器人 遵循 Microsoft指示 https learn microsoft com en us microsoftteams platform concepts cu
  • CUDA 确定每个块的线程、每个网格的块

    我是 CUDA 范式的新手 我的问题是确定每个块的线程数和每个网格的块数 这是否需要一些艺术和尝试 我发现许多例子似乎为这些事情选择了任意的数字 我正在考虑一个问题 我可以将任意大小的矩阵传递给乘法方法 这样 C 的每个元素 如 C A B
  • Java 8 中流的笛卡尔积作为流(仅使用流)

    我想创建一种方法 该方法创建一个元素流 这些元素是多个给定流的笛卡尔积 最后由二元运算符聚合为相同类型 请注意 参数和结果都是流 not收藏 例如 对于两个流 A B and X Y 我希望它产生价值流 AX AY BX BY 简单的串联用
  • Docx4j 字符串中的换行符

    我有这个字符串 Prueba Lista li1 li2 li3 li4 Tabulado Tabulado Tabulado Tabulado Tabulado Tabulado Tabulado Tabulado Tabulado Ta
  • dplyr 中的 substr %>% mutate

    pcd lt data frame tripNo c 618 618 610 610 610 619 procDate as Date c 2016 03 02 2016 03 03 2016 03 02 2016 03 03 2016 0
  • 手动调用按钮上的 click() ,我可以传递任何参数吗?

    我在 jquery javascript 代码中手动调用页面上的按钮上的 click 我需要传递一个参数来单击 然后我可以在响应单击事件的函数上读取该参数 这可能吗 你需要调用 trigger 您可以在那里传递任意数量的参数 element
  • 将尾部输出通过管道传输到另一个脚本中

    我正在尝试将 tail 命令的输出通过管道传输到另一个 bash 脚本中进行处理 tail n 1 f your log file myscript sh 但是 当我运行它时 永远不会到达 1 参数 在 myscript sh 内 我缺少什
  • ORA-38104: ON 子句中引用的列无法更新

    我有一个带有删除标志的简单表 记录应在此列中更新而不是删除 create table PSEUDODELETETABLE ID NUMBER 8 not null PKEY NAME VARCHAR2 50 not null ISDELET
  • 为订阅优惠生成签名 - Xcode - Swift

    我想问是否有人已经实现了 inapp 订阅 自动续订 的新优惠 如果可能的话 在服务器端创建系统以使用 p8 密钥和 php 创建此签名的难度 我在苹果文档中找到了这个 我不确定是否理解它 https developer apple com
  • Jquery 无法检测 IE 11

    刚刚偶然发现一个问题 当尝试使用 Jquery 检测 IE 11 当前正在播出的测试版 时 结果是 firefox 相同的代码检测 IE 10 我需要知道用户正在使用什么浏览器才能显示不同的指令 我正在 Oracle VirtualBox
  • Spark DataFrame 架构可为空字段

    我在 Scala 和 Python 中编写了以下代码 但是返回的 DataFrame 似乎没有应用我正在应用的架构中的非空字段 italianVotes csv是一个 csv 文件 以 作为分隔符和四个字段 我正在使用火花2 1 0 意大利
  • 在多索引数据框中选择行

    我想单独提取 S 的 bin 其中每列 X Y gt 0 5 或多个 bin gt 0 5 行数 在示例中 对于 AR1 应仅选择 bin 4 因为 X 和 Y gt 0 5 蓝色指示 对于 PO1 应选择 bin 1 2 3 和 4 因为