Python 通过将数据帧转换为序列,您可以进行分组吗?

Python 通过将数据帧转换为序列,您可以进行分组吗?,python,pandas,statsmodels,Python,Pandas,Statsmodels,我想使用pandas和statsmodels来拟合数据帧子集上的线性模型,并返回预测值。然而,我很难想出正确的熊猫成语来使用。以下是我试图做的: import pandas as pd import statsmodels.formula.api as sm import seaborn as sns tips = sns.load_dataset("tips") def fit_predict(df): m = sm.ols("tip ~ total_bill", df).fit()

我想使用pandas和statsmodels来拟合数据帧子集上的线性模型,并返回预测值。然而,我很难想出正确的熊猫成语来使用。以下是我试图做的:

import pandas as pd
import statsmodels.formula.api as sm
import seaborn as sns

tips = sns.load_dataset("tips")
def fit_predict(df):
    m = sm.ols("tip ~ total_bill", df).fit()
    return pd.Series(m.predict(df), index=df.index)
tips["predicted_tip"] = tips.groupby("day").transform(fit_predict)
这会引发以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-139-b3d2575e2def> in <module>()
----> 1 tips["predicted_tip"] = tips.groupby("day").transform(fit_predict)

/Users/mwaskom/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in transform(self, func, *args, **kwargs)
   3033                     return self._transform_general(func, *args, **kwargs)
   3034         except:
-> 3035             return self._transform_general(func, *args, **kwargs)
   3036 
   3037         # a reduction transform

/Users/mwaskom/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _transform_general(self, func, *args, **kwargs)
   2988                     group.T.values[:] = res
   2989                 else:
-> 2990                     group.values[:] = res
   2991 
   2992                 applied.append(group)

ValueError: could not broadcast input array from shape (62) into shape (62,6)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1提示[“预测提示”]=tips.groupby(“天”).transform(拟合预测)
/转换中的Users/mwaskom/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc(self、func、*args、**kwargs)
3033返回自转换\u常规(func、*args、**kwargs)
3034除:
->3035返回自转换\u常规(func、*args、**kwargs)
3036
3037#还原变换
/用户/mwaskom/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in_transform_general(self、func、*args、**kwargs)
2988组的T值[:]=res
2989其他:
->2990组。值[:]=res
2991
2992已应用。追加(组)
ValueError:无法将输入数组从形状(62)广播到形状(62,6)
这个错误是有意义的,因为我认为
.transform
想要将一个数据帧映射到一个数据帧。但是,有没有一种方法可以对数据帧执行groupby操作,将每个块传递到一个函数中,该函数将其缩减为一个系列(具有相同的索引),然后将生成的系列组合成可以插入原始数据帧的内容?

编辑:

q.gps.apply(lambda df:df.join(q.fit\u predict(df)))

我不得不修改你的
fit\u predict
函数来命名
系列

def fit_predict(df):
m = sm.ols("tip ~ total_bill", df).fit()
s = pd.Series(m.predict(df), index=df.index)
s.name = 'Prediction' #EDIT
return s

这里的顶部是一样的,我只是使用一个玩具数据集b/c,我在防火墙后面

tips = pd.DataFrame({ 'day':list('MMMFFF'), 'tip':range(6), 
                      'total_bill':[10,40,20,80,50,40] })

def fit_predict(df):
    m = sm.ols("tip ~ total_bill", df).fit()
    return pd.Series(m.predict(df), index=df.index)
如果将“转换”更改为“应用”,您将得到:

tips.groupby("day").apply(fit_predict)

day   
F    3    2.923077
     4    4.307692
     5    4.769231
M    0    0.714286
     1    1.357143
     2    0.928571
这并不是您想要的,但是如果您降低级别=0,您可以根据需要继续:

tips['predicted'] = tips.groupby("day").apply(fit_predict).reset_index(level=0,drop=True)

  day  tip  total_bill  predicted
0   M    0          10   0.714286
1   M    1          40   1.357143
2   M    2          20   0.928571
3   F    3          80   2.923077
4   F    4          50   4.307692
5   F    5          40   4.769231

但是,您会注意到,它不适用于问题中给出的示例。它不相关,因为
。description
数据帧
映射到
数据帧
,而不是
数据帧
映射到
系列
。您是正确的。我修改了答案,将DataFrame to DataFrame函数传递给
transform
。有趣的是,这不适用于seaborn tips数据集,因为有一个错误涉及到
day
是一个分类对象。我想知道这是否是熊猫身上的一只虫子。在熊猫大师身上工作。有一个错误,分类没有joins/concats.Cool的标志@汤姆斯普格,你认为这是熊猫最惯用的方法吗?如果是的话,我会做正确的标记
.transform
是正确的方法,但它要求输出具有相同的索引和列。
ignore\u index
和/或
ignore\u columns
kwargs是否是合理的建议增强?如果你认为这会受到欢迎,我可以提出一个问题。