我有一个大约有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']))
您可以将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