Эффективное использование сценариев If Then в Dask при создании нового столбца - PullRequest
0 голосов
/ 05 октября 2019

У меня есть CSV с примерно 11 м строк, которые я читаю в dask dataframe. Я пытаюсь создать новый столбец, который является результатом сценария if / then / else. У меня возникают проблемы с пониманием того, как заставить его работать, и не менее важно, чтобы он работал эффективно. Я новичок в пандах / дасках.

По сути, это то, что я пробовал: Вызов функции из события создания столбца. Это упрощенный пример того, что я пытался.

#var1 = 0
#var2 = 10

def find_situation:
    If (var1 == 0 and var2 > 10):
        print("Situation 1")
    elif var1 == 0 and var2 < 10:
        print("Situation 2")
    else:
        print("No Situation")

ddf['situation'] = ddf.apply(find_situation(ddf['ddfvar1'], ddf['ddfvar2']))

При таком подходе появляется сообщение об ошибке «ValueError: Истинное значение Series является неоднозначным. Используйте a.any () или a.all ().» * Разделы справки по этим действиям читаются какбудут рассмотрены какие-либо или все значения из строки анализируемых данных, а не значения, которые я передаю функции?

Кроме того, я прочитал, что векторизация выполняется намного быстрее, но я не уверен, чтоэто сценарий, в котором запрос может быть векторизованным ?

Длинная версия, где я просто пытаюсь определить значение в столбце месяца в качестве отправной точки. На самом деле мне нужно перейти к типу соединения, если я сделал заявления в упрощенном примере.: * 10101 *

import dask.dataframe as dd
import dask.multiprocessing
import dask.threaded
import pandas as pd

# Dataframes implement the Pandas API
import dask.dataframe as dd

def f(x):
    if x == 9:
        y = 'Nine'
    elif x == 2:
        y= 'Two'
    else :
        y= 1 
    return y


ddf['AndHSR'] = ddf.apply(f(ddf['Month']))

1 Ответ

1 голос
/ 05 октября 2019

Вы можете использовать np.select для векторизованного подхода.

import pandas as pd
import numpy as np

np.random.seed(500)

df = pd.DataFrame({"var1":np.random.randint(0,20,10000000),
                   "var2":np.random.randint(0,25,10000000)})

df["result"] = np.select([(df["var1"]==0)&(df["var2"]>10),
                          (df["var1"]==0)&(df["var2"]<10)],  #list of conditions
                         ["Situation 1", "Situation 2"],     #list of results
                         default="No situation")             #default if no match

print (df.groupby("result").count())

#
                     var1     var2
result                        
No situation  9520776  9520776
Situation 1    279471   279471
Situation 2    199753   199753
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...