创建新列时在Dask中有效使用If Then场景

问题描述 投票:0回答:1

我有一个大约有11m行的csv,我正在将其读入dask数据帧。我正在尝试创建一个新的列,该列是if / then / else场景的结果。我在理解如何使其工作方面遇到了一些麻烦,并且同样重要的是要使其高效工作。我是熊猫/黄昏的新手。

基本上这是我尝试过的:从create column事件中调用一个函数。这是我一直在尝试的简化示例。

#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:系列的真值不明确。请使用a.any()或a.all()。“这些操作的帮助主题读为any或将考虑要分析的数据行中的所有值,而不是我传递给函数的值?

而且,我读到矢量化要快得多,但是我不确定这是否是可以vectorized进行查询的情况?

长版,我只是在这里尝试确定month列中的值作为起点。如果我在简化示例中所做的声明,确实需要使用复合类型。:

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']))

python pandas conditional-statements vectorization dask
1个回答
0
投票

您可以将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
© www.soinside.com 2019 - 2024. All rights reserved.