Изменять значения переменных столбца в зависимости от условий в кадрах данных dask - PullRequest
0 голосов
/ 04 марта 2019

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

Решение связанного вопроса приведено ниже.

df = pd.DataFrame({'A':['ant','ant','cherry', 'bee', 'ant'], 'B':['cat','peach', 'cat', 'cat', 'peach'], 'C':['dog','dog','roo', 'emu', 'emu']}) #How to read this sort of format directly to dask dataframe?

ddf = dd.from_pandas(df, npartitions=2) # dask conversion
list1 = ['A','B','C'] #list1 of hearder names


for c in list1:
    vc = ddf[c].value_counts().compute()
    vc /= vc.sum()
    print(vc) # A table with the proportion of unique values
    for i in range(vc.count()):
        if vc[i]<0.5: # Checks whether the varaible value has a proportion of less than .5
            ddf[c] = ddf[c].where(ddf[c] != vc.index[i], 'others') #changes such variable value to 'others' (iterates though all clumns mentioned in list1)
    print(ddf.compute()) #shows how changes have been implemented column by column 

Однако секунда дляЦикл занимает очень много времени вычислений в фактическом (больше чем память) кадре данных.Есть ли более эффективный способ получить тот же результат, используя dask.

Цель кода - изменить значение переменной столбца на others для меток, которые появляются в столбце менее 50% времени.Например, если значение ant появилось менее чем в 50% случаев в столбце, измените имя на others

. Кто-нибудь сможет мне помочь с этим?

Спасибо

Майкл

1 Ответ

0 голосов
/ 04 марта 2019

Вот способ пропустить ваш вложенный цикл:

import pandas as pd
import dask.dataframe as dd

df = pd.DataFrame({'A':['ant','ant','cherry', 'bee', 'ant'],
                   'B':['cat','peach', 'cat', 'cat', 'peach'],
                   'C':['dog','dog','roo', 'emu', 'emu']})

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

l = len(ddf)

for col in ddf.columns:
    vc = (ddf[col].value_counts()/l)
    vc = vc[vc>.5].index.compute()
    ddf[col] = ddf[col].where(ddf[col].isin(vc), "other")

ddf = ddf.compute()

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

...