这是我很久以来的问题!我在 StackOverflow 上搜索了其他问答,但没有找到任何对我的问题有用的答案。
我有一个 pandas DataFrame,其中包含诸如
之类的列|---------------------|------------------|
| date | Prediction |
|---------------------|------------------|
| 2014-01-01 | 0.0 |
|---------------------|------------------|
| 2014-01-01 | 0.0 |
|---------------------|------------------|
| 2014-01-02 | 0.0 |
|---------------------|------------------|
| 2014-01-02 | 0.0 |
|---------------------|------------------|
我想在 Prediction
列的单元格中设置值(在 date
列上使用 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' object does not support item assignment
我对输出的期望是:
|---------------------|------------------|
| 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 数据帧。
任何实现这一目标的建议都将受到高度赞赏。
编辑 我的数据框中有更多日期(比上面的示例中显示的日期多)。我需要仅填充特定日期(不是所有日期)的预测列值。
谢谢。
最佳答案
您可以使用 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
关于python - 将 pandas 系列分配给 groupby 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48175172/