在Pandas

时间:2017-08-29 22:24:30

标签: python pandas dataframe

我将数据分组,并分成训练和测试集。我希望计算z - 分数。在训练集上,这很容易,因为我可以使用内置函数来计算均值和标准差。

这是一个例子,我在哪里寻找z分数:     将pandas导入为pd     导入numpy为np     #我的示例数据框

train = pd.DataFrame({'place':     ['Winterfell','Winterfell','Winterfell','Winterfell','Dorne', 'Dorne','Dorne'],
                      'temp' : [ 23 , 10 , 0 , -32, 90, 110, 100 ]})
test  = pd.DataFrame({'place': ['Winterfell', 'Winterfell', 'Dorne'],
                      'temp' : [6, -8, 100]})

# get the z-scores by group for the training set
train.loc[: , 'z' ] = train.groupby('place')['temp'].transform(lambda x: (x - x.mean()) / x.std())

现在,训练数据框采用以下形式:

|    Place   | temp |   z   |
|------------|------|-------|
| Winterfell |    23| 0.969 |
| Winterfell |    10| 0.415 |
| Winterfell |     0|-0.011 |
| Winterfell |   -32|-1.374 |
|      Dorne |    90| 1.000 |
|      Dorne |   110|-1.000 |
|      Dorne |   100| 0.000 | 

这就是我想要的。

问题是我现在想要使用训练集的平均值和标准偏差来计算测试集中的z分数。我可以很容易地得到均值和标准差:

summary = train.groupby('place').agg({'temp' : [np.mean, np.std]} ).xs('temp',axis=1,drop_level=True)

print(summary)

          mean        std
place                        
Dorne       100.00  10.000000
Winterfell    0.25  23.471614

我有一些复杂的方法可以做我想要的事情,但由于这是我必须经常做的任务,我正在寻找一种整洁的方式来做到这一点。这是我到目前为止所尝试的:

  1. 从摘要表中创建字典dict,我可以在其中提取作为元组的均值和标准偏差。然后在测试集上,我可以申请:

    test.loc[: , 'z'] = test.apply(lambda row: (row.temp - dict[row.place][0]) / dict[row.place][1] ,axis = 1)
    
  2. 为什么我不喜欢它?

    • 字典使其难以阅读,需要知道dict的结构是什么。
    • 如果某个地方出现在测试集中但没有出现在训练集中,那么代码就会抛出错误。

      1. 使用索引

        test.set_index('place', inplace = True)
        test.loc[:, 'z'] = (test['temp'] - summary['mean'])/summary['std']
        

    为什么我不喜欢它:    - 看起来应该可行,但只给我NaNs

    最终结果应该是 是否有一种标准的pythonic方式来进行这种组合?

1 个答案:

答案 0 :(得分:3)

选项1
public string GetEntityInJson() { JavaScriptSerializer j = new JavaScriptSerializer(); var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute }); return j.Serialize(entityList ); }

pd.Series.map

选项2
test.assign(z= (test.temp - test.place.map(summary['mean'])) / test.place.map(summary['std']) ) place temp z 0 Winterfell 6 0.244977 1 Winterfell -8 -0.351488 2 Dorne 100 0.000000

pd.DataFrame.eval