Python 分组和移位dask数据帧

Python 分组和移位dask数据帧,python,dask,Python,Dask,我想使用dask 2.14扩展我在熊猫数据帧上的一些操作。 例如,我想对数据帧的列应用移位: import dask.dataframe as dd data = dd.read_csv('some_file.csv') data.set_index('column_A') data['column_B'] = data.groupby(['column_A'])['column_B'].shift(-1) 但是我得到了AttributeError:'SeriesGroupBy'对象没有属性'

我想使用dask 2.14扩展我在熊猫数据帧上的一些操作。 例如,我想对数据帧的列应用移位:

import dask.dataframe as dd
data = dd.read_csv('some_file.csv')
data.set_index('column_A')
data['column_B'] = data.groupby(['column_A'])['column_B'].shift(-1)
但是我得到了AttributeError:'SeriesGroupBy'对象没有属性'shift' 我阅读了dask文档,发现没有这样的方法(虽然在熊猫中有)

你能推荐一些有效的替代方案吗

谢谢你

GitHub上有一个关于这个的网站。基本上,您必须使用
apply
来绕过它。我不确定这是否会对
dask
的性能产生影响。还有一张票据引用了该问题,并声明该问题存在于
pandas
,但它已经开放了一段时间

这应等同于
pandas
操作:

import dask.dataframe as dd
import pandas as pd
import random

df = pd.DataFrame({'a': list(range(10)),
                   'b': random.choices(['x', 'y'], k=10)})

print("####### PANDAS ######")
print("Initial df")
print(df.head(10))
print("................")

pandas_df = df.copy()
print("Final df")

pandas_df['a'] = pandas_df.groupby(['b'])['a'].apply(lambda x: x.shift(-1))

print(pandas_df.head(10))
print()


print("####### DASK ######")
print("Initial df")
dask_df = dd.from_pandas(df, npartitions=1).reset_index()
print(dask_df.head(10))
print("................")

dask_df['a'] = dask_df.groupby(['b'])['a'].apply(lambda x: x.shift(-1))

print("Final df")
print(dask_df.head(10))
显然,我无法在
dask
中对该方法进行基准测试,因为似乎没有其他选择。但是,我可以在
pandas
中:

import string

import numpy as np
import pandas as pd


df = pd.DataFrame({'a': list(range(100000)),
                   'b': np.random.choice(list(string.ascii_lowercase), 100000)
                   })

def normal_way(df):
    df = df.groupby(['b'])['a'].shift(-1)

def apply_way(df):
    df = df.groupby(['b'])['a'].apply(lambda x: x.shift(-1))
timeit
结果如下:

%timeit normal_way(df)
4.25 ms ± 98 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit apply_way(df)
15 ms ± 446 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

根据dask文档系列,对象有一个移位方法。但是,您正在尝试将其应用于SeriesGroupBy对象,该对象是在对序列调用groupby方法时返回的。groupby不会返回一个系列!Series和SeriesGroupBy对象不一样!在熊猫身上,它的工作方式完全相同。你所需要做的就是先用更新的数据重新分配你想要的序列,然后再打电话给值班人员。谢谢。在熊猫中确实有一种SeriesGroupBy方法(参见)。我只想在每个组内移位)我的错,但是这并没有改变这样一个事实,即dask数据帧列是具有移位方法的系列对象,而seriesgroupby对象没有。有没有什么原因让你不能重新分配你的系列,而你必须在一个系列GroupBy上使用它?如果是这样的话,老实说,我已经没有选择了,否则你可以尝试这种方法。我考虑过,但是ff a在一个系列上使用移位方法,一些移位的元素将在另一个组中,这对我来说是不正确的(我可以用na或smtg替换它们),你能解释一下为什么你要在B列中移位项目吗?另外,我可以假设数据框中元素的顺序是有意义的吗?如果没有这一点,转变可能会导致毫无意义的结果。谢谢,我没有那么担心表现,因为没有其他选择。我现在只是需要一个简单的解决办法。谢谢你的回答。为了记录在案,我比较了dask/groupby/apply/shift和pandas/groupby/shift的计时,似乎前者的持续时间是后者的两倍左右(无论如何,现在不是问题)。@LucaMonno当我看到
apply
:)时,我忍不住跑到
timeit
)欢迎你回答。我只试过
dask
偶尔看看它是怎么回事。在我看来,这是API中一个相当大的漏洞,我希望他们能够解决它,但进展似乎很慢。我想知道熊猫1.0的发布是否意味着它可以再次访问。我会单独调查的