在pandas数据框中传递带参数的resample()方法函数
我想在一个pandas的数据框中使用resample()函数,并且希望在传入时指定一些参数,而不是定义几个不同的函数。
这是我想用的函数:
import itertools
def spell(X, kind='wet', how='mean', threshold=0.5):
if kind=='wet':
condition = X>threshold
else:
condition = X<=threshold
length = [sum(1 if x==True else nan for x in group) for key,group in itertools.groupby(condition)]
if not length:
res = 0
elif how=='mean':
res = np.mean(length)
else:
res = np.max(length)
return res
这里有一个数据框:
idx = pd.DatetimeIndex(start='1960-01-01', periods=100, freq='d')
values = np.random.random(100)
df = pd.DataFrame(values, index=idx)
接下来,我想对它做一些操作:
df.resample('M', how=spell(kind='dry',how='max',threshold=0.7))
但是我遇到了一个错误,提示 TypeError: spell() takes at least 1 argument (3 given)
。我希望能够传递这个函数,并指定这些参数,除了输入的数组。有没有办法做到这一点?
补充说明:
X是传递给函数的输入数组,当我在数据框对象上调用resample方法时,就像这样 df.resample('M', how=my_func)
,这是为了按月进行重采样。
如果我尝试 df.resample('M', how=spell)
,我得到的结果是:
0
1960-01-31 1.875000
1960-02-29 1.500000
1960-03-31 1.888889
1960-04-30 3.000000
这正是我想要的默认参数,但我希望能够在传递之前指定函数的输入参数。这可能包括将定义存储在另一个变量中,但我不太确定如何在更改默认参数的情况下做到这一点。
1 个回答
-1
我觉得这可能是你在找的东西,不过有点难说……如果有帮助的话请告诉我。首先,这是一个示例数据框:
idx = pd.DatetimeIndex(start='1960-01-01', periods=100, freq='d')
values = np.random.random(100)
df = pd.DataFrame(values, index=idx)
编辑:最开始用的是大于号,而不是小于或等于……接下来是这个函数:
def spell(df, column='', kind='wet', rule='M', how='mean', threshold=0.5):
if kind=='wet':
df = df[df[column] > threshold]
else:
df = df[df[column] <= threshold]
df = df.resample(rule=rule, how=how)
return df
所以,你可以这样调用它:
spell(df, 0)
这样可以得到:
0
1960-01-31 0.721519
1960-02-29 0.754054
1960-03-31 0.746341
1960-04-30 0.654872
你也可以调整参数:
spell(df, 0, kind='something else', rule='W', how='max', threshold=0.7)
0
1960-01-03 0.570638
1960-01-10 0.529357
1960-01-17 0.565959
1960-01-24 0.682973
1960-01-31 0.676349
1960-02-07 0.379397
1960-02-14 0.680303
1960-02-21 0.654014
1960-02-28 0.546587
1960-03-06 0.699459
1960-03-13 0.626460
1960-03-20 0.611464
1960-03-27 0.685950
1960-04-03 0.688385
1960-04-10 0.697602