将pandas系列分配给groupby操作

时间:2018-01-09 19:13:42

标签: python pandas numpy dataframe group-by

经过很长时间这是我的问题!!我已经在StackOverflow上搜索了其他Q& A,但没有找到任何有用的答案。

我有一个带有

等列的pandas DataFrame
|---------------------|------------------|  
|      date           |     Prediction   |  
|---------------------|------------------|  
|       2014-01-01    |         0.0      |  
|---------------------|------------------|  
|       2014-01-01    |         0.0      |  
|---------------------|------------------|  
|       2014-01-02    |         0.0      |  
|---------------------|------------------|  
|       2014-01-02    |         0.0      |  
|---------------------|------------------|  

我想在date列的单元格中设置值(使用Prediction列上的groupby操作)而不是0.这样假设我的预测是一个数据框x,其中有两个价值

|---------------------|------------------|  
|      date           |       yhat       |  
|---------------------|------------------|  
|       2014-01-01    |         2.0      |  
|---------------------|------------------|  
|       2014-01-02    |         3.0      |  
|---------------------|------------------|  

我尝试按以下df.groupby('date', as_index=False)['Prediction'] = x['yhat']

进行操作

但它给我一个错误:

  

TypeError:' DataFrameGroupBy'对象不支持项目分配

我对输出的期望是:

|---------------------|------------------|  
|      date           |     Prediction   |  
|---------------------|------------------|  
|       2014-01-01    |         2.0      |  
|---------------------|------------------|  
|       2014-01-01    |         2.0      |  
|---------------------|------------------|  
|       2014-01-02    |         3.0      |  
|---------------------|------------------|  
|       2014-01-02    |         3.0      |  
|---------------------|------------------| 

由于分组操作基本上是两行数据帧,因此我期望它能够正常工作,因为x也是一个带有2个值的pandas数据帧。

我们非常感谢您提供此任何建议。

修改 我的数据框中有更多日期(比上面的示例所示)。我只需要为特定日期(不是所有日期)填充预测列值。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用join()操作执行此操作。例如:

data = pd.DataFrame({'Prediction': [0, 0, 0, 0]},
                    index=['2014-01-01', '2014-01-01', '2014-01-02', '2014-01-02'])
vals = pd.DataFrame({'yhat': [2, 3]}, index=['2014-01-01', '2014-01-02'])
result = data.join(vals)
result
#             Prediction  yhat
# 2014-01-01           0     2
# 2014-01-01           0     2
# 2014-01-02           0     3
# 2014-01-02           0     3

但现在这些专栏并不完全是你想要的。因此,我们会删除原始Prediction并重命名yhat

result.drop('Prediction', axis=1).rename({'yhat': 'Prediction'}, axis=1)
#             Prediction
# 2014-01-01           2
# 2014-01-01           2
# 2014-01-02           3
# 2014-01-02           3