python - 根据日期条件创建列,但出现此错误 AttributeError : 'SeriesGroupBy' object has no attribute 'sub' ?

标签 python pandas dataframe

嘿,这里是一个 python 新手。
假设我有这个数据数据框的前两列:

df = pd.DataFrame({'group': ["Sun", "Moon", "Sun", "Moon", "Mars", "Mars"],
                   'score': [2, 13, 24, 15, 11, 44], 
                   'datetime': ["2017-08-30 07:00:00", "2017-08-30 08:00:00", "2017-08-31 07:00:00", "2017-08-31 08:00:00", "2017-08-29 21:00:00", "2017-08-28 21:00:00"],
                   'difference': [2, 13, 22, 2, -33, 44]})
我想创建一个名为 difference 的新列(我把它放在那里作为说明),这样
它是平等的:
  • 该行的得分值 - 该组前一天同一小时的得分值

  • 例如第 3 行的差异等于:
    该行的得分 - 前一天(30 日)的得分 08:00:00对于该组(即 Moon),即 15 - 13 = 2 .如果前一天和同一时间不存在,则取该行的分数值(例如,在第 0 行,对于时间 2017-08-30 07:00:00 没有 2017-08-29 07:00:00,因此只取 2)。
    我写了以下内容:
    df['datetime'] = pd.to_datetime(df['datetime'])
    before = df['datetime'] - pd.DateOffset(days=1)
    
    df['difference'] = df.groupby(["group", "datetime"])['score'].sub(
        before.map(df.set_index('datetime')['score']), fill_value=0)
    
    但我收到错误:
    AttributeError: 'SeriesGroupBy' 对象没有属性 'sub'
    我错过了什么?有没有更优雅的解决方案?

    最佳答案

    MultiIndex.map我们可以设置group列连同 before列作为数据帧的索引,然后 map具有相同分值的多索引 group然后从 score 中减去映射的分数值列计算差异。

    s = df.set_index(['group', before]).index.map(df.set_index(['group', 'datetime'])['score'])
    df['difference'] = df['score'].sub(list(s), fill_value=0)
    
    >>> df
    
      group  score            datetime  difference
    0   Sun      2 2017-08-30 07:00:00         2.0
    1  Moon     13 2017-08-30 08:00:00        13.0
    2   Sun     24 2017-08-31 07:00:00        22.0
    3  Moon     15 2017-08-31 08:00:00         2.0
    4  Mars     11 2017-08-29 21:00:00       -33.0
    5  Mars     44 2017-08-28 21:00:00        44.0
    

    关于python - 根据日期条件创建列,但出现此错误 AttributeError : 'SeriesGroupBy' object has no attribute 'sub' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67036970/

    相关文章:

    python Pandas DataFrame 复制(deep=False)vs 复制(deep=True)vs '='

    python - 有问题的 DataFrame 切片?

    python - 使用 Lighttpd 设置 gevent,奇怪的东西

    python - 如何有效地将多个列添加到 pandas 数据框中,其值依赖于其他动态列

    python - tensorflow:LSTM 单元中变量的初始化程序

    python - Unpickle 二进制文件到文本

    python-3.x - 从字典列表中获取组合数据框

    python - 使用 read_csv 将财务数据导入 Python Pandas

    python - 在 pandas DataFrame 多索引函数之外解压列表

    python - 当列名不同时如何将数据框附加到另一个数据框(具有相同的列大小)