Pythoni c способ уменьшения уровней фактора в большом датафрейме - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь уменьшить количество уровней факторов в столбце в кадре данных pandas так, чтобы общее количество экземпляров любого фактора в виде доли всех строк столбца было ниже определенного порога (по умолчанию установлено значение 1%), будет объединен с новым фактором, помеченным «Другое». Ниже приведена функция, которую я использую для выполнения sh этой задачи:

def condenseMe(df, column_name, threshold = 0.01, newLabel = "Other"):

    valDict = dict(df[column_name].value_counts() / len(df[column_name]))
    toCondense = [v for v in valDict.keys() if valDict[v] < threshold]
    if 'Missing' in toCondense:
        toCondense.remove('Missing')
    df[column_name] = df[column_name].apply(lambda x: newLabel if x in toCondense else x)

Проблема, с которой я сталкиваюсь, заключается в том, что я работаю с большим набором данных (~ 18 миллионов строк) и пытаюсь использовать это функция на столбце с более чем 10000 уровней. Из-за этого выполнение этой функции в этом столбце занимает очень много времени. Есть ли еще Pythoni c способ уменьшить количество уровней факторов, которые будут выполняться быстрее? Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 31 марта 2020

Вы можете сделать это с помощью комбинации groupby, tranform и count:

def condenseMe(df, col, threshold = 0.01, newLabel="Other"):
    # Create a new Series with the normalized value counts
    counts = df[[col]].groupby(col)[col].transform('count') / len(df)
    # Create a 1D mask based on threshold (ignoring "Missing")
    mask = (counts < threshold) & (df[col] != 'Missing')

    # Assign these masked values a new label
    df[col][mask] = newLabel
...