Python Dask groupby应用,然后在索引上连接,无需昂贵的重新索引
我在Dask遇到了一个我想摆脱的情况,不需要使用很多昂贵的重置索引操作 我有一个执行groupby应用程序的任务(其中应用程序返回一个与输入数据帧大小不同的数据帧,在本例中,这是由Python Dask groupby应用,然后在索引上连接,无需昂贵的重新索引,python,pandas,dask,Python,Pandas,Dask,我在Dask遇到了一个我想摆脱的情况,不需要使用很多昂贵的重置索引操作 我有一个执行groupby应用程序的任务(其中应用程序返回一个与输入数据帧大小不同的数据帧,在本例中,这是由.head()和.tail()与reset\u index()模拟的) 操作在不同的数据帧上执行,这两个数据帧需要连接。然而,这种行为并不像我预期的那样。我原以为数据帧只在dask索引上连接,由于dask没有实现多索引,我惊讶地发现它在dask索引和应用程序返回的索引上都连接: import dask.datafram
.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来自不同数据帧的情况,但我认为它在我的实际案例中仍然有用是的,它也可能通过自定义延迟将文件合并到上游。。。