Агрегация конкатов Dask String - PullRequest
0 голосов
/ 17 апреля 2020

Ниже приведена операция pandas. Как я могу сделать это в Dask?

In [10]: pdf
Out[10]:
  name  text
0    a  asdf
1    b  fdsa
2    a  qwer
3    c  zxcv
4    c  jkl;

In [11]: pdf.groupby('name').aggregate(" ".join)
Out[11]:
           text
name
a     asdf qwer
b          fdsa
c     zxcv jkl;

Я хочу объединить столбец text путем объединения строк в соответствующей группе. В настоящее время Dask предлагает агрегаты только для чисел c типов. Как я могу это сделать?

1 Ответ

1 голос
/ 18 апреля 2020

Вместо агрегат вы можете использовать apply .

Run:

pdf.groupby('name').text.apply(lambda grp: ' '.join(grp),
    meta=('text', 'object')).compute()

Если вы хотите отсортировать результат по индексу , сделайте это на уровне Pandas (после compute () ), добавив .sort_index() к приведенному выше коду.

Другое решение на основе пользовательской агрегации:

  1. import itertools as it (будет использоваться ниже).

  2. Определите следующую пользовательскую агрегацию:

    collect_concat = dd.Aggregation(name='collect_concat',
        chunk=lambda s1: s1.apply(list),
        agg=lambda   s2: s2.apply(lambda chunks: list(it.chain.from_iterable(chunks))),
        finalize=lambda s3: s3.apply(lambda xx: ' '.join(xx))
    )
    
  3. Вычислить результат:

    pdf.groupby('name').text.agg(collect_concat).compute()
    

На этот раз результат упорядочен по name .

...