Сбой сравнения экстракта регулярного выражения Dask с NotImplementedError - PullRequest
0 голосов
/ 21 января 2020

У меня есть кадр данных Dask, который выглядит следующим образом:

class1                                  statement             class2              value
<geoentity_Pic_de_Font_Blanca_2986043>  <hasLatitude>         42.64991^^<degrees> 42.64991
<geoentity_Pic_de_Font_Blanca_2986043>  <hasLongitude>        1.53335^^<degrees>  1.53335
<geoentity_Pic_de_Font_Blanca_2986043>  <hasGeonamesEntityId> 2986043             NaN
<geoentity_Pic_de_Font_Blanca_2986043>  rdfs:label            Pic de Font Blanca  NaN

Я пытаюсь проверить, совпадает ли число в class1 с числом в class2 для всех строк <hasGeonamesEntityId>; так что я могу избавиться от этих строк, так как они будут нести ненужно дублированные данные.

Я пытался:

df[(df['statement'] == '<hasGeonamesEntityId>') & (df['class1'].str.extract(r'_(\d+)>$') == df['class2'])].head()

, но это дает мне следующую ошибку:

E:\WPy-3710\python-3.7.1.amd64\lib\site-packages\dask\dataframe\core.py in __getitem__(self, key)
   3347             graph = HighLevelGraph.from_collections(name, dsk, dependencies=[self, key])
   3348             return new_dd_object(graph, name, self, self.divisions)
-> 3349         raise NotImplementedError(key)
   3350 
   3351     def __setitem__(self, key, value):

NotImplementedError: Dask DataFrame Structure:
                    0     1
npartitions=442            
                 bool  bool
                  ...   ...
...               ...   ...
                  ...   ...
                  ...   ...
Dask Name: and_, 3978 tasks

Мои dtypes:

class1       category
statement    category
class2         object
value        category

Я не уверен, почему это не удается, поскольку extract само по себе, похоже, возвращает правильную подстроку. Кто-нибудь знает, что я делаю не так?

1 Ответ

1 голос
/ 22 января 2020

Трудно сказать без воспроизводимого примера, но похоже, что вы пытаетесь проиндексировать Dask DataFrame с другим Dask DataFrame, который не поддерживается и, вероятно, не тот, который вам нужен.

Использование только pandas

In [18]: df = pd.DataFrame({"A": ['a1', 'b2', 'c3']})

In [19]: df[df.A.str.extract('(\d)') == '1']
Out[19]:
     A
0  NaN
1  NaN
2  NaN

Это потому, что .str.extract возвращает DataFrame. Установите expand=False, чтобы получить 1D серию

In [20]: df[df.A.str.extract('(\d)', expand=False) == '1']
Out[20]:
    A
0  a1

, которая также работает для Dask

In [21]: df = dd.from_pandas(df, 2)

In [22]: df[df.A.str.extract('(\d)', expand=False) == '1']
Out[22]:
Dask DataFrame Structure:
                    A
npartitions=1
0              object
2                 ...
Dask Name: getitem, 5 tasks

In [23]: _.compute()
Out[23]:
    A
0  a1
...