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

pas*_*cot 5 python dataframe pandas

嘿,这里是一个 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]})
Run Code Online (Sandbox Code Playgroud)

我想创建一个名为difference(我把它放在那里作为插图)的新列,这样它就相等:

  • 该行的得分值 - 该组前一天同一小时的得分值

例如,第 3 行中的差异等于:该行中的分数 -08:00:00该组(即月亮)的前一天(30 日)的分数,即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)
Run Code Online (Sandbox Code Playgroud)

但我收到错误:AttributeError: 'SeriesGroupBy' object has no attribute 'sub'

我错过了什么?有没有更优雅的解决方案?

Shu*_*rma 3

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)
Run Code Online (Sandbox Code Playgroud)
>>> 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
Run Code Online (Sandbox Code Playgroud)