嘿,这里是一个 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/