我有一个数据框,里面有测量数据,第二个数据框有这些测量数据。例如:
def calc_zscore(x, mean, stdev):
return (x - mean)/stdev
metrics = ['Temperature', 'Length', 'Width']
values = ['mean', 'stdev']
data = pd.DataFrame(columns = metrics)
stats = pd.DataFrame(index = metrics, columns = values)
stats.ix['Temperature', 'mean'] = 72.1
stats.ix['Temperature', 'stdev'] = 6.3
data.loc[0, 'Temperature'] = 68.2
data.loc[1, 'Temperature'] = 76.2
data.loc[2, 'Temperature'] = 73.6
metric = 'Temperature'
for row in data.index:
data.ix[row, metric + '_zscore'] = calc_zscore( data.ix[row, metric], stats.ix[metric, 'mean'], stats.ix[metric, 'stdev'])
print data
这可以按照我的意愿工作,但是我必须迭代数据框中的每一行。它很慢,数据帧有300k行。我还需要为每列计算z_score,但为了保持简单,我只为此示例执行Temperature列。
Temperature Length Width Temperature_zscore
0 68.2 NaN NaN -0.619048
1 76.2 NaN NaN 0.650794
2 73.6 NaN NaN 0.238095
使用apply()方法似乎是pandas magic heaven的路径,但是我不知道如何使用apply()将正确的值传递给calc_zscore函数。
PS我实际上并没有计算z得分,我只是以此为例。我知道我也可以使用mean()和std()方法,但它只是一个例子,让我们假装它们不存在。
答案 0 :(得分:0)
这相当于你的for循环:
data['Temperature_zscore'] = data['Temperature'].apply(calc_zscore, args=(stats.ix[metric, 'mean'], stats.ix[metric, 'stdev']))
答案 1 :(得分:0)
除了palako的答案,它显示了如何将参数传递给您正在应用的函数,您还可以在apply中使用lambda函数:
data['Temp_zscore'] = data['Temperature'].apply(lambda x: calc_zscore(x, stats.ix[metric, 'mean'], stats.ix[metric, 'stdev']))
或者,考虑从functools创建partial。
from functools import partial
mean = 5.0
stdv = 2.0
def yourfunc(x, m, s):
return (x - m) / s
partfunc = partial(yourfunc, m=mean, s=stdv)
然后应用部分功能:
data['Temp_zscore'] = data['Temperature'].apply(partfunc)