pandas - Pandas 动态 Groupby 和 Shift
问题描述
我正在尝试在 groupby 对象中执行动态转换。在这种情况下,我的分组是 Account 并且每个帐户的 Valuation 列都会移动减去Shift 列中指定的行数。前段时间有一个类似的问题,但涉及一个 cumsum,在这里我只想要这个值。请参阅dataframe 上的 groupby 动态移位。如果可能的话,出于性能原因,我想避免申请,因为我有数百万行。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Account': [1000001, 1000001, 1000001, 1000001, 1000001, 1000001, 1000001,
1000001, 1000001, 1000001, 1000002, 1000002, 1000002, 1000002,
1000002, 1000002, 1000002, 1000002, 1000002],
'Date': ['Jan-18', 'Feb-18', 'Mar-18', 'Apr-18', 'May-18', 'Jun-18',
'Jul-18', 'Aug-18', 'Sep-18', 'Oct-18', 'Jan-18', 'Feb-18',
'Mar-18', 'Apr-18', 'May-18', 'Jun-18', 'Jul-18', 'Aug-18',
'Sep-18'],
'Valuation':[ 50000, 51000, 52020, 53060, 54122, 55204, 56308, 57434,
58583, 59755, 100000, 102000, 104040, 106121, 108243, 110408,
112616, 114869, 117166],
'Shift': [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2] })
所需的数据框如下所示:
解决方案
您可能拥有比班次更多的独特帐户,因此我们将循环遍历少量班次。给定 on 的排序'Account'
,where
支票 Account 等于转移后的 Account 确保它在组内。
import pandas as pd
s = pd.Series()
for shift in df.Shift.unique():
u = (df[df.Shift.eq(shift)].Valuation.shift(-shift)
.where(df.Account.eq(df.Account.shift(-shift))))
s = s.combine_first(u)
df['Valuation Shifted'] = s
Account Date Valuation Shift Valuation Shifted
0 1000001 Jan-18 50000 3 53060.0
1 1000001 Feb-18 51000 3 54122.0
2 1000001 Mar-18 52020 3 55204.0
3 1000001 Apr-18 53060 3 56308.0
4 1000001 May-18 54122 3 57434.0
5 1000001 Jun-18 55204 3 58583.0
6 1000001 Jul-18 56308 3 59755.0
7 1000001 Aug-18 57434 3 NaN
8 1000001 Sep-18 58583 3 NaN
9 1000001 Oct-18 59755 3 NaN
10 1000002 Jan-18 100000 2 104040.0
11 1000002 Feb-18 102000 2 106121.0
12 1000002 Mar-18 104040 2 108243.0
13 1000002 Apr-18 106121 2 110408.0
14 1000002 May-18 108243 2 112616.0
15 1000002 Jun-18 110408 2 114869.0
16 1000002 Jul-18 112616 2 117166.0
17 1000002 Aug-18 114869 2 NaN
18 1000002 Sep-18 117166 2 NaN
推荐阅读
- python - 遍历多个 response.get API 的项目列表
- php - 我无法让我的 php 数据库正常工作
- python - Find and print the number of non-alphanumeric characters in python
- docker - 无法从 docker 容器访问主机
- python - 使用返回值作为变量而不调用整个函数
- colors - 如何使用 PyCharm 打印成彩色?
- javascript - 如何通过返回布尔型 Observable 的函数过滤作为数组的 Observable
- java - 具有加载延迟的插页式广告
- c - 在 gtk 中,如何在同一个窗口上切换到带有新按钮和其他小部件的新屏幕?
- google-apps-script - 加载包含所有联系电子邮件的数组