Как отобразить столбец с помощью dask

Я хочу применить сопоставление к столбцу DataFrame. С Pandas это прямолинейно:

df["infos"] = df2["numbers"].map(lambda nr: custom_map(nr, hashmap))

Это записывает столбец infos на основе функции custom_map и использует строки в числах для оператора lambda.

С dask это не так просто. ddf — это Dask DataFrame. map_partitions эквивалентно параллельному выполнению отображения в части DataFrame.

Это не работает, потому что вы не определяете такие столбцы в dask.

ddf["infos"] = ddf2["numbers"].map_partitions(lambda nr: custom_map(nr, hashmap))

Кто-нибудь знает, как я могу использовать столбцы здесь? Я не понимаю их документацию по API вообще.


person wishi    schedule 13.10.2016    source источник
comment
Dask текущая версия 1.2 уже может принимать приведенный выше синтаксис: df['new_col']=df['col2].map_parttion(some_func)   -  person skibee    schedule 12.05.2019


Ответы (1)


Вы можете использовать метод .map. , точь-в-точь как в пандах

In [1]: import dask.dataframe as dd

In [2]: import pandas as pd

In [3]: df = pd.DataFrame({'x': [1, 2, 3]})

In [4]: ddf = dd.from_pandas(df, npartitions=2)

In [5]: df.x.map(lambda x: x + 1)
Out[5]: 
0    2
1    3
2    4
Name: x, dtype: int64

In [6]: ddf.x.map(lambda x: x + 1).compute()
Out[6]: 
0    2
1    3
2    4
Name: x, dtype: int64

Метаданные

Вас могут попросить указать ключевое слово meta=. Это позволяет dask.dataframe узнать имя вывода и тип вашей функции. Копируем строку документации из map_partitions сюда:

meta : pd.DataFrame, pd.Series, dict, iterable, tuple, optional

An empty pd.DataFrame or pd.Series that matches the dtypes and 
column names of the output. This metadata is necessary for many 
algorithms in dask dataframe to work. For ease of use, some 
alternative inputs are also available. Instead of a DataFrame, 
a dict of {name: dtype} or iterable of (name, dtype) can be 
provided. Instead of a series, a tuple of (name, dtype) can be 
used. If not provided, dask will try to infer the metadata. 
This may lead to unexpected results, so providing meta is  
recommended. 

For more information, see dask.dataframe.utils.make_meta.

Итак, в приведенном выше примере, где моим выводом будет серия с именем 'x' и dtype int, я могу сделать одно из следующих, чтобы быть более явным.

>>> ddf.x.map(lambda x: x + 1, meta=('x', int))

or

>>> ddf.x.map(lambda x: x + 1, meta=pd.Series([], dtype=int, name='x'))

Это сообщает dask.dataframe, чего ожидать от нашей функции. Если метаданные не указаны, dask.dataframe попытается запустить вашу функцию на небольшом фрагменте данных. Это вызовет ошибку с просьбой о помощи, если это не удастся.

person MRocklin    schedule 13.10.2016
comment
в моем случае вывод метаданных не удался, укажите ключевое слово meta - кажется, в некоторых случаях это требуется... - person wishi; 13.10.2016
comment
Ожидается ли, что meta = int также будет работать? Хотя это, кажется, не упоминается в строке документации, я думаю, что видел это где-то на github. - person Someone; 13.10.2016