2017-08-28 12 views
0

Daskを使用してgroupBy集計を行った後、指定された列から一意の項目数を取得できるかどうかを知りたいと思います。私はこのようなことはドキュメントには見当たりません。これはパンダのデータフレームで利用でき、本当に便利です。私はこれに関連するいくつかの問題を見てきましたが、実装されているかどうかはわかりません。Dask:Dataframe groupByのヌニークメソッド

誰かに私にこのことについてのヒントを教えてもらえますか?

答えて

0

dask groupbyにnuniqueを実装するには、集約関数を使用する必要があります。

import pandas as pd 
import dask.dataframe as dd 

def chunk(s): 
    ''' 
    The function applied to the 
    individual partition (map) 
    '''  
    return s.apply(lambda x: list(set(x))) 


def agg(s): 
    ''' 
    The function whic will aggrgate 
    the result from all the partitions(reduce) 
    ''' 
    s = s._selected_obj  
    return s.groupby(level=list(range(s.index.nlevels))).sum() 


def finalize(s): 
    ''' 
    The optional functional that will be 
    applied to the result of the agg_tu functions 
    ''' 
    return s.apply(lambda x: len(set(x))) 


tunique = dd.Aggregation('tunique', chunk, agg,finalize) 

df = pd.DataFrame({ 
'col': [0, 0, 1, 1, 2, 3, 3] * 10, 
'g0': ['a', 'a', 'b', 'a', 'b', 'b', 'a'] * 10, 
}) 

ddf = dd.from_pandas(df, npartitions=10) 

res = ddf.groupby(['col']).agg({'g0': tunique}).compute() 
print(res) 
+0

@mdurantねえ、それが正しい方法であるか、より効率的なやり方があるかどうかを確認できますか、ありがとう –