Как преобразовать серию Dask как строковый тип, если он содержит нехешируемый тип? - PullRequest
1 голос
/ 03 августа 2020

Я хотел бы вызвать .value_counts() для произвольной серии Dask, и я хочу преобразовать серию как тип string , если он содержит нехешируемый тип. Я не хочу преобразовывать серию в строку, если мне не нужно. Я также не хочу звонить .compute() перед звонком .value_counts(). Я пробовал

df = pd.DataFrame({"a":[[1], ["foo"], ["foo", "bar"]]})
df = dd.from_pandas(df, npartitions=1)
srs = df["a"]

try:
    val_counts = srs.value_counts()
except TypeError:
    srs = srs.astype(str)
    val_counts = srs.value_counts()

val_counts.compute()

, что дает ошибку

TypeError: unhashable type: 'list'

и

df = pd.DataFrame({"a":[[1], ["foo"], ["foo", "bar"]]})
df = dd.from_pandas(df, npartitions=1)
srs = df["a"]

def func(srs):
    try:
        val_counts = srs.value_counts()
    except TypeError:
        srs = srs.astype(str)
        val_counts = srs.value_counts()
    return val_counts

val_counts = dask.compute(func(srs))

, что дает ту же ошибку.

Я также пробовал

df = pd.DataFrame({"a":[[1], ["foo"], ["foo", "bar"]]})
df = dd.from_pandas(df, npartitions=1)
srs = df["a"]

if srs.apply(lambda y: isinstance(y, list), meta=srs).any():
    srs = srs.astype(str)

srs.value_counts().compute()

, что дает ошибку

TypeError: Попытка преобразовать dd.Scalar в логическое значение.

1 Ответ

2 голосов
/ 08 августа 2020

Может быть, сначала преобразовать списки во что-то хешируемое, например кортеж?

s.apply(tuple).value_counts()  ? 
...