将列添加到pandas数据框中,该数据框是另一列

时间:2016-11-21 00:10:07

标签: python

我有一个数据框,里面有测量数据,第二个数据框有这些测量数据。例如:

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()方法,但它只是一个例子,让我们假装它们不存在。

2 个答案:

答案 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)