python - 通过对列进行分组并对另一列中的先前值求和来创建数据框列
问题描述
我正在寻找一种更简单的方法来创建一个新列,该列表示按 ColA 对数据框进行分组,并且对于 ColB 中的每个日期,将 ColC 中的前两个值相加。下面的例子:
原DF
ColA ColB ColC
dog 10/13/2021 2
dog 10/14/2021 1
dog 10/15/2021 8
cat 10/12/2021 2
cat 10/13/2021 5
cat 10/14/2021 6
cat 10/15/2021 1
frog 10/12/2021 6
frog 10/13/2021 9
frog 10/14/2021 2
frog 10/15/2021 4
所需的DF
ColA ColB ColC NewCol
dog 10/13/2021 2 NaN
dog 10/14/2021 1 2
dog 10/15/2021 8 3
cat 10/12/2021 2 NaN
cat 10/13/2021 5 2
cat 10/14/2021 6 7
cat 10/15/2021 1 11
frog 10/12/2021 6 NaN
frog 10/13/2021 9 6
frog 10/14/2021 2 15
frog 10/15/2021 4 11
我知道我可以通过遍历 ColA 类别并制作子集数据帧等来做到这一点,但会是几行代码。有人有更快的选择/想法吗?谢谢。
解决方案
使用 lambda 函数rolling
和shift
类似:
f = lambda x: x.rolling(2, min_periods=1).sum().shift()
df['new'] = df.groupby('ColA')['ColC'].apply(f).reset_index(level=0, drop=True)
print (df)
ColA ColB ColC new
0 dog 10/13/2021 2 NaN
1 dog 10/14/2021 1 2.0
2 dog 10/15/2021 8 3.0
3 cat 10/12/2021 2 NaN
4 cat 10/13/2021 5 2.0
5 cat 10/14/2021 6 7.0
6 cat 10/15/2021 1 11.0
7 frog 10/12/2021 6 NaN
8 frog 10/13/2021 9 6.0
9 frog 10/14/2021 2 15.0
10 frog 10/15/2021 4 11.0
或与双重groupby
喜欢:
df['new'] = (df.groupby('ColA')['ColC'].rolling(2, min_periods=1).sum()
.groupby(level=0).shift()
.reset_index(level=0, drop=True))
print (df)
ColA ColB ColC new
0 dog 10/13/2021 2 NaN
1 dog 10/14/2021 1 2.0
2 dog 10/15/2021 8 3.0
3 cat 10/12/2021 2 NaN
4 cat 10/13/2021 5 2.0
5 cat 10/14/2021 6 7.0
6 cat 10/15/2021 1 11.0
7 frog 10/12/2021 6 NaN
8 frog 10/13/2021 9 6.0
9 frog 10/14/2021 2 15.0
10 frog 10/15/2021 4 11.0
推荐阅读
- c++ - 为什么我的字符串长度与我选择的不同?
- scala - Scala:想要在同一个类的每个方法之前实现要调用的函数(类似于@before implementation))
- c# - 我用文本抛出自己的错误,但我的 API 向客户端返回 500 错误而没有描述(我需要它)
- mongodb - 如何在 MacOS Catalina 10.15 版中安装 MongoDb?
- reactjs - 路由参数链接没有重定向
- sql - SQL - 比较表的特定要求
- python-3.x - 未绘制箭头
- javascript - ES6 变量作用域:无法访问函数内的值
- django - 如何同时运行 Daphne 和 Gunicorn?
- mysql - SQLite Group 通过给出重复项