Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dask groupby应用,然后在索引上连接,无需昂贵的重新索引_Python_Pandas_Dask - Fatal编程技术网

Python Dask groupby应用,然后在索引上连接,无需昂贵的重新索引

Python Dask groupby应用,然后在索引上连接,无需昂贵的重新索引,python,pandas,dask,Python,Pandas,Dask,我在Dask遇到了一个我想摆脱的情况,不需要使用很多昂贵的重置索引操作 我有一个执行groupby应用程序的任务(其中应用程序返回一个与输入数据帧大小不同的数据帧,在本例中,这是由.head()和.tail()与reset\u index()模拟的) 操作在不同的数据帧上执行,这两个数据帧需要连接。然而,这种行为并不像我预期的那样。我原以为数据帧只在dask索引上连接,由于dask没有实现多索引,我惊讶地发现它在dask索引和应用程序返回的索引上都连接: import dask.datafram

我在Dask遇到了一个我想摆脱的情况,不需要使用很多昂贵的重置索引操作

我有一个执行groupby应用程序的任务(其中应用程序返回一个与输入数据帧大小不同的数据帧,在本例中,这是由
.head()
.tail()
reset\u index()
模拟的)

操作在不同的数据帧上执行,这两个数据帧需要连接。然而,这种行为并不像我预期的那样。我原以为数据帧只在dask索引上连接,由于dask没有实现多索引,我惊讶地发现它在dask索引和应用程序返回的索引上都连接:

import dask.dataframe as dd
import pandas as pd

ddf = dd.from_pandas(
          pd.DataFrame(
                {
                   "group_col": ["A", "A", "A", "B", "B"], 
                   "val_col": [1, 2, 3, 4, 5], 
                   "val_col2": [5, 4, 3, 2, 1]
                }
          ), npartitions=1)

ddf = ddf.set_index("group_col")
out_ddf = ddf.groupby("group_col").apply(lambda _df: _df.head(2).reset_index(drop=True))
out_ddf2 = ddf.groupby("group_col").apply(lambda _df: _df.tail(1).reset_index(drop=True))

out_ddf.join(out_ddf2, rsuffix="_other").compute()
下面是上面的输出

             val_col  val_col2  val_col_other  val_col2_other
group_col                                                    
A         0        1         5            3.0             3.0
          1        2         4            NaN             NaN
B         0        4         2            5.0             1.0
          1        5         1            NaN             NaN
所需的输出(无需昂贵的改组)将是:

             val_col  val_col2  val_col_other  val_col2_other
group_col                                                    
A                 1          5             3              3
                  2          4             3              3
B                 4          2             5              1
                  5          1             5              1
我尝试了
.join
/
.merge
调用的各种组合,并通过以下方式获得了结果:

out_ddf.reset_index().merge(out_ddf2.reset_index(), suffixes=(None, "_other"), on="group_col").compute()
但是我想在以后对同一个索引做更多的操作,所以我担心这会影响性能,不得不在索引上来回摇摆

因此,我正在寻找一种解决方案,它可以在不改变dask索引的情况下,在操作过程中提供所需的结果,因为数据帧非常大


谢谢

下面的代码通常可能不起作用,但对于您的示例,我将使用这样一个事实,即计算是在一个组中完成的,并将它们组合到一个应用于一个组的单个函数中。这样可以避免合并/数据混乱:

def myfunc(df):
df1=df.head(2).重置索引(drop=True)
df2=df.tail(1)。添加后缀(“其他”)。重置索引(drop=True)
返回df1.join(df2.fillna)(method='ffill')
out\u ddf=ddf.groupby('group\u col')。应用(myfunc)
打印(输出\u ddf.compute())

对于更复杂的工作流,需要更细致的解决方案来跟踪每次计算中的数据依赖关系。

谢谢,这绝对是一种有帮助的思考方式,我认为你是对的,它不容易推广到df1和df2来自不同数据帧的情况,但我认为它在我的实际案例中仍然有用是的,它也可能通过自定义延迟将文件合并到上游。。。