【问题标题】:Groupby Dataframe with Multiindex具有多索引的 Groupby 数据框
【发布时间】:2021-07-15 04:08:29
【问题描述】:

我有一个二维网格,上面有一条路径。我想计算网格的每个点到路径上每个点的距离,然后做一些 groupby 操作。我为此使用 dask.dataframe,但是我会用 pandas 来解释它,因为我认为这不是一个大问题。

代码类似这样

import numpy as np 
import pandas as pd

x = np.linspace(0, 100, 100)
xv, yv = np.meshgrid(x, x, sparse='True') 

path = np.random.rand(5, 2)

dists = []
for i in range(5):
    xd = xv-path[i,0]
    yd = yv-path[i, 1]
    d = np.sqrt(xd**2+yd**2)
    dists.append(d)

df = pd.concat([pd.DataFrame(c) for c in dists], axis=1, keys=np.arange(5))

所以dataframe应该大致是这样的

0 1 2 3 4
Grid distance to first point (100 x 100 dataframe) Grid distance to second point (100 x 100 dataframe) ... ... Grid distance to last point (100 x 100 dataframe)

现在我想从这个数据框中计算出最大的“网格”。正如我想要获得一个 100 x 100 的网格,它代表路径的所有 5 个点的最大值。我该怎么做?

我不能使用关键字级别,因为它在 dask 中不受支持。但是我可以使用 df.columns.levels 所以我尝试了这个(在许多其他事情中)但它没有工作

df.groupby(df.columns.levels[1]).max()

它返回一个 100 x 500 的数据框,这不是我想要的。

知道如何解决这个问题吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以在groupby 中指定level=1, axis=1,以便按列索引的第二级(axis=1)进行分组:

    df.groupby(level=1, axis=1).max()
    
    #           0          1          2   ...          97          98          99
    #0    1.005712   0.805206   1.746326  ...   97.705173   98.715274   99.725375
    #1    0.997070   1.208150   1.991410  ...   97.709861   98.719913   99.729967
    #2    1.987666   2.101498   2.631042  ...   97.724989   98.734887   99.744790
    #3    2.991336   3.068154   3.452485  ...   97.750554   98.760191   99.769837
    #4    3.998246   4.056039   4.354026  ...   97.786546   98.795815   99.805101
    #..        ...        ...        ...  ...         ...         ...         ...
    #95  95.908388  95.910815  95.923878  ...  136.911072  137.633739  138.360005
    #96  96.918485  96.920886  96.933814  ...  137.620549  138.339509  139.062090
    #97  97.928582  97.930958  97.943753  ...  138.333762  139.049036  139.767948
    #98  98.938679  98.941031  98.953695  ...  139.050656  139.762260  140.477523
    #99  99.948776  99.951105  99.963640  ...  139.771172  140.479127  141.190758
    
    #[100 rows x 100 columns]
    

    【讨论】:

    • 非常感谢您的回答!因此,我实际上为此使用了另一个基于 pandas(dask 数据框)的库。而且这个库没有 level 和 axis 关键字。是否有替代您建议仅使用索引的替代方法?
    • 我不熟悉 dask。您可以对 dask 数据帧的每个分区使用 pandas API(因为 dask 数据帧是内部的 pandas 数据帧的集合)?如果是,那么您也许可以利用这一点。
    • dask Aggregate API 可能是您需要的。 dd.Aggregation 并使用上述语法作为chunk 函数,pd.concat 作为agg 函数可以给出所需的输出。
    猜你喜欢
    • 2020-12-17
    • 2016-12-08
    • 2018-08-01
    • 2021-07-13
    • 1970-01-01
    • 2022-09-27
    • 2021-10-02
    • 2017-11-20
    • 2017-09-06
    相关资源
    最近更新 更多