如何避免在sklearn / pandas工作流程中创建列表列?

时间:2018-10-26 02:48:57

标签: python pandas

我的总体目标是找到最佳的工作流程,以根据多种模型生成预测。这是一个示例,说明如何尝试在DataFrame中按组拟合模型并获得预测以及用于预测的数据:

from sklearn.linear_model import LinearRegression
import pandas as pd

start_data = pd.DataFrame({
    'group': ['a'] * 3 + ['b'] * 3,
    'x1': [1, 2, 3] * 2,
    'x2': [4, 5, 6] * 2,
    'y': [1, 3, 5, 2, 4, 6]
})

start_models = start_data\
    .groupby('group')\
    .apply(lambda group: LinearRegression().fit(group[['x1', 'x2']], group['y']))\
    .to_frame(name = 'model')

new_data = pd.DataFrame({'x1': [11, 12, 13] * 2, 'x2': [7, 8, 9] * 2})
start_models['preds'] = start_models.model.apply(lambda model: model.predict(new_data))
start_models['newx1'] = start_models.model.apply(lambda model: new_data.x1.tolist())
start_models['newx2'] = start_models.model.apply(lambda model: new_data.x2.tolist())

这提供了一个DataFrame,每行包含一个模型及其相关的预测。

start_models
                                                   model         ...                       newx2
group                                                            ...
a      LinearRegression(copy_X=True, fit_intercept=Tr...         ...          [7, 8, 9, 7, 8, 9]
b      LinearRegression(copy_X=True, fit_intercept=Tr...         ...          [7, 8, 9, 7, 8, 9]

在R中,使用tidyr::unnest可以轻松解决。在这里,我发现this question提供了以下解决方案,但也建议在pandas中最好避免首先创建嵌套的DataFrame。

start_models.drop(columns='model')\
    .apply(lambda listcol: listcol.apply(pd.Series).stack())\
    .reset_index()\
    .drop(columns='level_1')
   group  preds  newx1  newx2
0      a   14.0     11      7
1      a   16.0     12      8
2      a   18.0     13      9
3      a   14.0     11      7
4      a   16.0     12      8
5      a   18.0     13      9
6      b   15.0     11      7
7      b   17.0     12      8
8      b   19.0     13      9
9      b   15.0     11      7
10     b   17.0     12      8
11     b   19.0     13      9

所以问题是,应该如何考虑将模型和预测结合在pandas中?换句话说,如何在不使用列表列的情况下从start_data转到上面的long输出?

使用列表列也可能很好,但是我想问一下。我认为这种方式对于我拥有的数据不会太慢,但是apply(pd.Series).stack()的笨拙向我暗示,应该有一种更好或更有针对性的方式来解决此问题。特别是,我感到非常惊奇的是,从apply返回Series的函数合并到DataFrame的行中,特别是在Series.apply文档中没有提到的情况下(尽管它在DataFrame.apply中)并且不适用于列表。如果您明白我的意思,那感觉更像是一种变通方法,而不是适当的工作流程!

0 个答案:

没有答案